2010-03-26 3 views
1

Je voudrais construire un programme d'installation MSI qui installe une DLL managée et le rend accessible aux utilisateurs du menu "Ajouter des références" de Visual Studio dans l'Explorateur de solutions . Je crois que je suis supposé ajouter une clef dans le registre de Windows mais je ne peux pas voir comment dire au projet de VS pour que le MSI fasse ceci à l'installation.Construire MSI pour installer DLL et le rendre accessible depuis "Ajouter des références" dans VS

Comment cela est-il fait et où devrais-je chercher des tutoriels sur ce genre de chose?

Répondre

1

Accédez à la clé de Registre suivante:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders 

Ajouter une sous-clé (dont le nom n'a pas d'importance, mais pourrait aussi bien être descriptif) dont la valeur par défaut est le dossier contenant vos assemblées, et vous devriez être bon à faire.

Comment ajouter la clé requise à l'aide WiX

Ceci est un fragment dépouillé code WiX pour créer le paramètre clé requise et sa valeur par défaut dans le dossier dans lequel vos ensembles ont été installés. Ce programme d'installation WiX n'est pas complet et ne peut pas être collé directement. J'ai supprimé les attributs Guid et affiché uniquement les déclarations Directory, Component et Feature. Une fois que vous avez vu un code complet Wix il devrait être raisonnablement clair comment fusionner ces bits.

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <!-- Path from WiX file to the DLL(s) you're installing --> 
    <?define BuildPath="..\Bin\Release" ?> 
    <!-- The base key path - note no HKLM --> 
    <?define AssemblyFolders = "Software\Microsoft\.NETFramework\AssemblyFolders" ?> 

    <Product> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramFilesFolder"> 
     <Directory Id="CompanyFolder" Name="YourCompany"> 
      <Directory Id="INSTALLLOCATION" Name="Your Product"> 
      <!-- Id="AssemblyFolder" captures the location where the DLL gets installed --> 
      <Directory Id="AssemblyFolder" Name="Bin"> 
       <Component Id="AssemblyComponent"> 
       <!-- This is the bit that copies the assembly file --> 
       <File Id="YourDll.dll" Checksum="yes" Source="$(var.BuildPath)YourDll.dll" /> 
       </Component> 
       <Component Id="ControlRegistrationComponent"> 
       <!-- This is the bit that creates the registry key --> 
       <RegistryKey Action="createAndRemoveOnUninstall" Root="HKLM" Key="$(var.AssemblyFolders)\Your Product Name"> 
        <!-- Square brackets result in a reference -- so the install folder gets picked up --> 
        <RegistryValue Action="write" Value="[AssemblyFolder]" Type="string" /> 
       </RegistryKey> 
       </Component> 
      </Directory> 
      </Directory> 
     </Directory> 
     </Directory> 
    </Directory> 

    <Feature Id="PRODUCTROOTFEATURE"> 
     <!-- This causes the assembly to be installed --> 
     <ComponentRef Id="AssemblyComponent" /> 
     <!-- This causes the registry key to be created --> 
     <ComponentRef Id="ControlRegistrationComponent" /> 
    </Feature> 

    </Product> 
</Wix> 

Pour construire le MSI une fois que vous avez un script complet Wix, vous pouvez utiliser un fichier de commandes, dont le noyau ressemble à ceci:

candle.exe "%WXS_NAME%.wxs" -out "%WXS_NAME%.wixobj" 
light.exe "%WXS_NAME%.wixobj" -out "%WXS_NAME%.msi" 

où% WXS_NAME% est le nom du fichier source du WiX.

(Je sais que cela semble probablement un peu énigmatique mais (a) il y a beaucoup d'exemples WiX, de tutoriels et de matériel de référence pour vous aider à démarrer et (b) le complément Votive pour Visual Studio peut vous protéger pour construire automatiquement le MSI, utilisez le complément Votive (partie de WiX), ou une étape de post-construction, ou un script de construction MSBuild. Nous utilisons un script de construction parce que nous voulons généralement construire le MSI seulement dans le cadre de notre construction automatisée - le faire dans une étape de post-construction ralentirait les builds de développement - mais votre kilométrage peut varier.

+0

J'ai modifié le registre sur la machine cible, ajouté Microsoft, .NETFramework et AssemblyFolders à HKEY_LOCAL_MACHINE \ SOFTWARE, puis ajouté une chaîne avec l'emplacement d'installation codé en dur (dois-je utiliser une variable d'environnement) mais ne fonctionne pas: la DLL n'est pas répertoriée dans Ajouter des références. Une idée de ce que je fais mal? –

+0

N'oubliez pas que vous devez créer une clé (dans regedit, un dossier) * sous * AssemblyFolders, et définir la valeur par défaut de cette * sous-clé *. Jetez un oeil à la base de registre sur votre machine pour voir des exemples. Et je suis un peu surpris que vous ayez à créer les clés de base - elles devraient déjà être là (en particulier 'HKLM \ SOFTWARE \ Microsoft'!). Ne le prenez pas mal, mais êtes-vous sûr d'ajouter les clés au bon endroit? – itowlson

+0

Un autre emplacement qui contribue à la boîte de dialogue Ajouter des références est 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ .NETFramework \ v2.0.50727 \ AssemblyFoldersEx'. – itowlson

Questions connexes