2010-12-05 61 views
2

Salutations à tous,Enregistrer une DLL COM dans le GAC avec WiX

Je travaille sur un script d'installation WiX pour mon programme. J'ai besoin d'installer une DLL C# au GAC, puis l'enregistrer. Donc, je marque le fichier avec Assembly=".net" afin que WiX GACs pour moi, puis j'ai une action personnalisée différée, mis à courir avant InstallFinalize, qui appelle Assembly.Load pour charger l'ensemble du GAC, puis RegistrationServices.RegisterAssembly pour l'enregistrer.

Devrait être parfait, à l'exception d'un problème: Apparemment, la DLL n'est pas réellement écrite dans le GAC jusqu'à la phase de validation, donc lorsque mon action personnalisée est exécutée, Assembly.Load jette parce qu'il ne trouve pas le fichier. Où est-ce? Est-ce accessible avant la phase de validation? Ou y a-t-il une meilleure façon de le faire entièrement? On dirait une telle chose triviale ...

ne S'il vous plaît suggérer de ne pas utiliser heat.exe; J'aimerais vraiment l'éviter. Mon programme a un ComRegisterFunction qui voudrait s'exécuter sur l'ordinateur de l'utilisateur si possible.

+0

Avez-vous déjà trouvé la solution? coincé avec exactement la même question :( – zaitsman

Répondre

0

auto-inscription en général est mal lors de l'installation, justement à cause de problèmes comme celui que vous avez décrit. Vous devez ajouter les entrées de registre au script WiX à la place.

, vous n'êtes pas non plus d'installer votre assembly dans le GAC seulement, êtes-vous? Pointez votre enregistrement COM vers l'emplacement non-GAC.

+0

I * am * installer au GAC seulement, c'est précisément le problème. Je demande si elle stocke dans un emplacement temporaire d'abord, quelque part que je peux accéder à mon action personnalisée. Je sais l'auto-enregistrement est méprisé, mais je n'aime pas perdre l'opportunité d'effectuer des contrôles conditionnels lors de l'inscription.therm, heat.exe montre que mes entrées de registre sont très grandes, une entrée pour chaque classe dans mon programme. Je ne sais pas s'ils sont tous nécessaires ou quoi, mais ça va changer constamment Je ne veux vraiment pas avoir à le mettre à jour constamment ... –

+0

Ce que je voulais dire, c'est "ne pas installer dans le GAC seulement, installer dans :-) Oui, les assemblys sont décompactés dans un dossier temporaire lors de l'installation, mais si vous lancez votre enregistrement COM à partir de ce dossier, le CLR les recherchera dans le répertoire, s'il est utilisé via COM, en raison de la valeur reg Codepath pointant là. –

+1

En outre, vous ne devriez vraiment exposer à COM que les classes dont vous avez besoin, en y appliquant directement ComVisible plutôt que l'ensemble. Et, pour éviter de modifier constamment les entrées reg, appliquez des GUID explicites à vos classes et interfaces COM-visibles, au lieu de laisser le compilateur les régénérer à chaque fois. (D'ailleurs, pour la compatibilité ascendante, vous devez geler will les GUIDs après que vous expédiez votre première version) D'accord, mais je ne –