2015-12-02 2 views
4

Voici mon code:System.EnterpriseServices.Internal.Publish.GacInstall ne fonctionne pas, mais aucune erreur

var s = new System.EnterpriseServices.Internal.Publish(); 
foreach (string file in Directory.EnumerateFiles(@"C:\Program Files\MyFolder\MSPractices")) 
{ 
    Console.WriteLine("GACing " + file); 
    s.GacInstall(file); 
} 

Ce sont les fichiers que je suis en train de GAC (version 6.0.1304.0)

Microsoft.Practices.EnterpriseLibrary.Caching.dll Microsoft.Practices.EnterpriseLibrary.Common.dll Microsoft.Practices.EnterpriseLibrary.Data.dll Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll Microsoft.Practices.EnterpriseLibr ary.ExceptionHandling.Logging.dll Microsoft.Practices.EnterpriseLibrary.Logging.Database.dll Microsoft.Practices.EnterpriseLibrary.Logging.dll Microsoft.Practices.EnterpriseLibrary.PolicyInjection.dll Microsoft.Practices.EnterpriseLibrary.Security.dll Microsoft.Practices.EnterpriseLibrary.Validation.dll Microsoft.Practices.ServiceLocation.dll Microsoft.Practices.Unity.Configuration.dll Microsoft.Practices.Unity.dll Microsoft.Practices.Unity.Interception.Configuration.dll Microsoft. Practices.Unity.Interception.dll

Ils m'ont été donnés par quelqu'un d'autre, donc je ne sais pas où vous pouvez les trouver, mais ils sont certainement disponibles en ligne.

Le code génère correctement cette liste et ne lance aucune exception, mais l'exécution gacutil /l révèle que seuls quelques-uns d'entre eux (mis en évidence ci-dessous) sont réellement installés.

enter image description here

Que peut-on ne va pas? POSSIBLEMENT IMPORTANT: Mon vrai problème est que cela ne fonctionne pas dans mon installateur InstallShield InstallScript avec un code similaire (en utilisant l'objet EnterpriseServices.Internal.Publish).

UPDATE:

Cette méthode ne jette aucune exception! ...pour rien! Publish pub = new Publish(); pub.GacInstall("foo");

Aucune erreur, aucune exception. Si le chemin est valide et que l'assembly est fortement nommé , il sera correctement installé dans le GAC. Fonctionne pour cible version .NET Frame de l'assembly. C'est à dire. une application .NET Framework 4.0 en utilisant GacInstall installera correctement un assemblage ciblé 3.5, etc.

Mise à jour (2011/12/13) - Après avoir utilisé ILSpy pour regarder le code pour cette fonction , je ne découvre que des erreurs sont envoyées à la machine locale Observateur d'événements:

Malheureusement, tous les événements dans l'observateur d'événements disent que

Installation dans le cache de l'assembly global a échoué: foo

Répondre

1

Il s'est avéré être Installshield. La version 6 des assemblys EnterpriseLibrary cible .NET 4.0 et, comme Installshield ne génère que des fichiers .exes 32 bits, il appelait .NET 2.0 System.EnterpriseServices .dll, qui ne pouvait pas enregistrer les assemblys .NET 4.0 EnterpriseLibrary. J'ai ajouté un outil C# personnalisé pour publier les assemblys appelés via installscript. C'est moche mais il faudra le faire jusqu'à ce que nous puissions convertir en WIX.

3

Vous avez déjà cam En conclusion, ces méthodes ne sont pas toujours utiles.

Si vous voulez une méthode plus robuste, vous pouvez le faire à partir de C# en utilisant l'API GAC/Fusion documentée here et here. Un exemple en C# peut être trouvé here (merci à Hans Passant), here ou here.

Vous pourriez aussi essayer gacutil.exe pour voir quel est le problème. Vous pouvez le trouver sur votre machine avec Visual Studio installé.