2010-11-04 6 views
0

Dans le programme d'installation de Windows, dossier Global Assembly Cache, j'ai un DLL que je souhaite enregistrer. La raison en est que ce fichier est référencé dans un fichier de configuration chargé lors de l'exécution de l'action personnalisée. Lorsque l'action personnalisée est exécutée, la configuration ne peut toujours pas localiser ce fichier (même si c'est supposé être dans le GAC). après un certain examen, (GACUTIL/l) il apparaît que le fichier n'est pas dans le GAC. Je n'arrive pas à comprendre pourquoi. Quand cet élément est-il ajouté au GAC? Après les actions personnalisées? cela ne me semble pas trop raisonnable. Il n'y a rien de spécial à propos de cette DLL. Il est généré à partir de la sortie du projet et est fortement nommé. Pourquoi d'autre ne pourrait-il pas apparaître dans le gac?Windows Installer, les éléments du dossier GAC ne s'affichent pas dans GAC

Merci

Répondre

0

Lorsque votre action personnalisé géré fonctionne, l'assemblage n'est pas encore inscrit dans le GAC.

En règle générale, votre ensemble d'action personnalisée ne doit jamais dépendre d'un assemblage déployé par le package d'installation, il réside.

Il y a tools que provide ways autour de cette règle, mais la plupart ne le font pas.

+1

Le problème est qu'il n'est pas réellement référencé par l'action personnalisée. l'application installée utilise WCF et la bibliothèque fait partie d'une liaison personnalisée. SO .. quand j'essaie de parcourir le fichier de configuration en utilisant ConfigurationManager, il se casse car le gestionnaire charge les types. Je suppose que je vais devoir revenir à la traversée XML en utilisant 'XMLDocument' pour mettre à jour le document. – Beta033

0

Windows Installer utilise MsiPublishAssemblies pour interagir avec l'API Fusion afin d'installer l'assembly sur le GAC. Le problème est que Windows Installer prend en charge le comportement transact/rollback, Fusion ne le fait pas. Par conséquent, Windows Installer attend jusqu'à la phase de validation de l'exécution du programme d'installation (à l'intérieur de InstallFinalize) pour envoyer les DLL au GAC. Cela crée une condition de concurrence pour les choses en fonction de l'assemblage (certaines actions et services personnalisés qui doivent être démarrés pendant l'installation). Un bon moyen de contourner ce problème consiste à utiliser WiX DTF pour créer vos actions personnalisées managées. L'une des fonctionnalités de DTF est de prendre tous les éléments de contenu de votre projet et les références et de les compresser dans votre dll CA. Ensuite, lors de l'exécution, tout est extrait dans un répertoire temporaire rendant vos dépendances disponibles. Maintenant, votre assembly est un fichier de support et non celui qui est réellement déployé, donc le commentaire de Frederic ne s'applique pas.