Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[VS2008, C#]Custom install

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik probeer een al een hele tijd een installatie te maken van mijn solution. Deze solution levert 6 dll's op. Deze dll's zijn plug-ins voor een andere applicatie.
Het gaat hier om 5 plug-ins. De 6de dll is eentje met gemeenschappelijke code ('CustomTools').
Het probleem is het volgende:
Ik weet niet zeker in welke folder de applicatie is geïnstalleerd. De applicatie zet een reg-key met de installatiepad. Die moet ik dus uitlezen, vervolgens kan ik dan de dll's naar de juiste folder kopieren: appFolder\plugins\subdir.
Ik moet dus de targetdir aanpassen.

Ik heb al een standaard deployment project toegevoegd. Die werkt ook prima, alleen daar moet ik op design-time al de installatiefolder opgeven: [ProgramFilesFolder]\appFolder\Plugins\subdir.

Ik heb ook een extra klasse aangemaakt van het type 'Installer class'. Deze klasse heb ik aan mijn 'CustomTools' project toegevoegd.
In deze klasse lees ik de regkey uit en wil ik de targetdir zetten.

Ik kan nergens vinden hoe ik in die nieuwe klasse de targetdir kan zetten.

Verder wordt er in de klasse een logfile gemaakt, maar die zie ik na de installatie niet terug. Het lijkt er dus op dat de klasse niet wordt gebruikt.

Eerst maar eens wat code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[RunInstaller(true)]
public partial class MyInstaller : Installer
{
    // From: http://msdn.microsoft.com/en-us/library/system.configuration.install.installer.aspx
    public MyInstaller() : base()
    {
        InitializeComponent();

        try
        {
            string logfilename = @"c:\install.log";
            Logger.StartToFile(logfilename, false, false, false);
            Logger.TimeStamping = true;
            Logger.Dbg("Start of installer");

            // Attach the 'Committed' event.
            this.Committed += new InstallEventHandler(MyInstaller_Committed);
            // Attach the 'Committing' event.
            this.Committing += new InstallEventHandler(MyInstaller_Committing);
            Logger.Dbg("Events attached");

            //read install path:
            string installPath = readInstallPath();
            Logger.Dbg("Using installPath: " + installPath);
            //Use installPath
            //???????? TARGETDIR= ??????????
        }
        catch (Exception ex)
        {
            Logger.Dbg("Major error: " + ex.ToString());
            Logger.Flush();
        }
    }


Moet ik nog ergens aan mijn installer aangeven dat hij bovenstaande klasse moet gebruiken?
En hoe zet ik de targetdir?

Alvast bedankt.

Paul

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Allereerst denk ik dat je het artikel (sectie remarks) nog maar eens moet lezen en dan vooral nog eens goed naar het voorbeeld kijken. Daarbij snap ik persoonlijk niet waarom 'installer' niet door Microsoft als abstract is gemarkeerd en dat developers verplicht worden AssemblyInstaller, ComponentInstaller of TransactedInstaller te gebruiken (een installatie lukt of mislukt, er is geen tussen weg).

Daarbij de installer installeert de applicatie niet voor jouw. Je zult zelf alle acties moet schrijven. Daarbij is de installer class in de eerste instantie ook niet bedoelt voor het kopieren van je class, maar voor de registratie (configuratie!) van jouw assembly. Daarbij is InstallUtil.exe ook niet de gemakkelijkste setup tool.

Als je op zoek bent naar een installer welke je class (assembly) in de juiste directory plaatst, dan zul je echt naar het Setup project moeten kijken (clickonce gaat (kan) hier niet werken) of een andere installatie tool.

Maar heb je weleens nagedacht over updates? Tis niet zo heel erg lastig om een 'plugin' installer te schrijven welke online een lijst met plugins ophaalt en de versies vergelijkt en ze automatisch update. Omdat onze werkwijze komt erg overeenkomt met de van Mozilla (Firefox, Thunderbird, etc) hebben wij deze min of meer gelijk getrokken (voorheen waren updates verplicht om te installeren, nu hebben wij ook de optie 'install later' tenzij een plugin aangeeft dat de update 'mandatory' is (bijvoorbeeld omdat een webservice is veranderd).

Persoonlijk denk ik niet dat de System.CONFIGURATION.installer namespace hetgeen is wat je zoekt..

If it isn't broken, fix it until it is..


Verwijderd

Topicstarter
Wat ik heb begrepen na het lezen van veel internet pagina's is dat je een setup&deployment project kunt maken voor je solution en dat je een install class kunt toevoegen, waarin je custom code plaatst.
Hierin wil ik dan niet alleen de targetdir wijzigen, maar ook een routine maken die oudere versies van mijn dll's verwijderd. Deze dll's staan eventueel in een verkeerde map.

Als ik Niemand_Anders goed begrijp is het 't een of 't ander. Heb ik dan goed begrepen?
Dan kan ik beter een VBScript bestandje maken die de registry uitleest, mijn dll's kopieert, eventueel een subdir maakt en eventueel oude versies verwijderd.

Maar ik kan me niet voorstellen dat dat niet in VS2008 eenvoudiger kan.

Als iemand anders kan bevestigen dat ik helemaal op het verkeerde spoor zit, dan lees ik het graag.

Verwijderd

Topicstarter
Het is me inmiddels gelukt.
Inderdaad moet ik aan mijn setup project doorgeven dat er een install classe gebruikt moet worden.
Dat doe je via de custom actions.
Het is me niet gelukt om de targetdir aan te passen. Ik installeer daarom de bestanden in de tempdir van de gebruiker en vervolgens kopieer ik de bestanden naar de juiste locatie via mijn custom code.
De gehele installatie doet nu wat die moet doen. Nu kan ik het gaan testen op pc's met andere OS. Vista is geloof ik wat lastiger met rechten ed. ;)

Er is nog wel 1 vage foutmelding aan het einde, maar daar open ik een nieuwe topic voor.

  • Angelus1753
  • Registratie: Juli 2005
  • Laatst online: 17-11 05:22
Voor de TS of toekomstige geinteresseerden:
http://www.codeproject.co...taller.aspx?display=Print

Hier staan wat screenshots bij en wordt ook uitgelegd hoe je een target dir kan hergebruiken. Het is mij echter niet gelukt mijn custom installer class aan te roepen bij installatie :(
Het artikel doet alsof dit automatisch gaat, maar het werkt niet bij mij.

<edit>Installer moet wel een appart project zijn waarvan je de output moet toevoegen aan de setup's Custom Actions.
</edit>

[ Voor 14% gewijzigd door Angelus1753 op 01-09-2008 12:10 ]