2008-10-02 14 views
2

J'ai un projet Web, un projet de bibliothèque C# et un projet d'installation Web dans Visual Studio 2005. Le projet Web doit avoir la bibliothèque C# doit être enregistrée dans le GAC. C'est simple, il suffit d'ajouter le dossier GAC au projet d'installation et de supprimer la sortie principale de la bibliothèque C# là-bas. La bibliothèque C# doit également être enregistrée pour COM interop. Je clique sur sélectionner la sortie principale dans le dossier GAC et change la propriété Register en vsdrpCOM. Je compile le projet d'installation et l'exécute mais la DLL n'est jamais enregistrée pour COM.Enregistrement COM et GAC

Ce n'est pas vraiment une surprise pour moi. J'ai toujours dû ajouter une classe d'installateur qui avait une action personnalisée qui utilisait RegistrationServices.RegisterAssembly pour enregistrer correctement mes DLL pour COM. Donc j'applique cette solution de contournement que j'ai acceptée depuis des années à ma situation. Maintenant, je trouve que les actions personnalisées affectées à la sortie principale dans le dossier GAC d'un projet d'installation empêchent même le projet d'installation de générer.

J'ai toujours eu l'impression de pirater les fichiers pour que .NET et COM puissent être utilisés avec succès dans les projets de configuration et de déploiement. Quelle est la bonne façon de résoudre mon problème?

Répondre

2

Wix, vous permettra d'installer vos objets et ensembles cơm dans le GAC avec peu d'agitation

WIX

2

Je ne connais pas le "bon" chemin, mais mon équipe résout ce problème avec des fichiers batch. Nous appelons le fichier quelque chose comme "cycleCOM.bat" et nous l'exécutons après une compilation lorsque nous avons besoin de mettre à jour le GAC et les services de composants. (Personnellement, j'utiliser un lanceur du clavier, je peux déclencher cela avec quelques frappes de touches)

version super-simplifiée du fichier batch:

REM Unregister anything currently in component services 

RemoveCom+.vbs 

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regsvcs /u "C:\source\bin\FooCode.dll" 

REM Remove from GAC 

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil" /uf FooCode 

REM Register in component services 

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regsvcs "C:\source\bin\FooCode.dll" 

REM Add to GAC 

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil" /if "C:\source\bin\FooCode.dll" 

Le fichier RemoveCom + .vbs arrête quoi que ce soit en cours d'exécution dans services de composants. Son code est:

set cat = CreateObject ("COMAdmin.COMAdminCatalog") 
Set apps = cat.GetCollection("Applications") 

bFound = false 
apps.Populate 

lNumApps = apps.Count 

' Enumerate through applications looking for AppName. 
Dim app 
For I = lNumApps - 1 to 0 step -1 
    Set app = apps.Item(I) 
    If app.Name = "FooCode" Then 
     cat.ShutdownApplication ("FooCode") 
     apps.Remove(I) 
     apps.SaveChanges 
    End If 
Next 

Nous avons plusieurs versions de ce script pour chaque version de notre application que nous travaillons localement, et les scripts, il est facile (bien, aussi facile qu'il peut obtenir) pour maintenir le GAC et COM + en synchronisation avec la version du code en cours d'édition.