36 votes

La réplication de Visual Studio COM inscription auprès d'un Installateur de WiX

Une fois, un jeune, naïf ingénieur pensé que ce serait une bonne idée de séparer une partie de la fonctionnalité de son application dans un composant COM, écrit en C#. Visual studio avait tous les outils pour le faire, non? .NET est pratiquement fait pour cela, non? HA! Il a dit, ce sera facile. Je vais avoir décent de séparation des composants de la logique métier à l'écart de l'extrémité avant, et avec COM, je vais être en mesure de l'utiliser à partir de n'importe où! Il gaiement vérifié l' register for COM interop case à cocher dans les propriétés du projet, a exposé les classses qu'il voulait, et continua son chemin.

Oh, les essais d'un tel choix. Le jeune ingénieur, maintenant, plus expérimenté, ne serait pas le souhaitons à personne. Toutefois, la charge a été placée sur ses épaules, et le fardeau est resté lourd. Il a cherché à alléger la charge.

Le long est venu WiX, un outil de génération de fichiers de Windows Installer XML. Cette intrigue - il pu répliquer, tout simplement, la plupart du code nécessaire à un bon programme d'installation de windows fichier simplement à partir d'une poignée de fichiers de configuration. Ses vues étaient à la recherche.

Avec WiX 2.0, il pourrait générer assez facilement les fichiers nécessaires pour inscrire un C# de l'objet COM. Cela a impliqué l'utilisation de l'outil de suif. Il en ferait quelque chose comme ce qui suit:

tallow -c -nologo MyComExposedLibrary.dll > MyComExposedLibrary.wxs

qui pourrait alors être fixé (au début, cela a été fait manuellement, mais finalement, j'ai enregistré les étapes en un petit outil de définir le répertoire finale ref id, ID de composant, fileID, GUID et de la base de code).

Ensuite, le suivi de l'installateur et de l'installer, et il y aurait une fête joyeuse, si l'application travaillé.

Ce qui n'est pas.

Pour les jours où le jeune ingénieur versé sur les différences sur son PC de développement et celle de l'installation test, PC. "Toutes les clés de registre sont les mêmes!" Il allait s'exclamer. "Tout pour MyComExposedLibrary est inscrit, je vous le jure!"

Sauf, qu'il ne l'était pas.

À l'aube du troisième jour, après de nombreuses rosée de montagne, il a réalisé qu'il y avait un autre objet que Visual Studio a été l'inscription de son programme d'installation n'a pas été: le MyComExposedLibrary.fichier tlb.

Visual Studio, apparemment, avait été l'enregistrement de ce fichier tout au long, de la création de nouvelles sous-clés de l' HKLM\Software\Classes\Interface clé de registre, et l'enregistrement de la bibliothèque de types en HKLM\SOFTWARE\Classes\TypeLib.

Le suif a donné aucune aide, en se plaignant qu'une .tlb n'était pas un fichier, il groked. Ni le WiX 3.0 bêta - cela semblait avoir encore plus de problèmes à obtenir des choses de travail.

J'ai aussi donné de la Chaleur de l'essayer. Cela a généré de registre éléments et les éléments de classe. J'ai nettoyé la chaleur de la sortie, et ensuite de le compiler, mais j'ai reçu un autre message d'erreur: error LGHT0130 : The primary key <uuid here> is duplicated in table 'Registry'. Problème est, autant que je peux dire, que l'uuid n'existe pas réellement dans aucun de mes wxs fichiers sources. Si je change autour de la composante ref ordre dans mon élément de la fonctionnalité, un autre composant dll donne cette erreur. Depuis que j'ai succombé à l'obtention d'un WiX version 3.0 du projet pour compiler, je n'ai pas été en mesure de confirmer si oui ou non la chaleur donne le droit de sortie.

J'ai tout enlevé de l'installateur, à l'exception de celui de l'assemblée qui provoquent l'affichage de cette erreur et a essayé de compiler à nouveau. J'ai eu la même erreur même. Arrugh!

Donc, mon bon boursiers, Windows les amateurs et utilisateurs de WiX, il tombe à deux questions:

  • Est un typelib quelque chose que WiX pouvez vous inscrire en natif? Si oui, comment?
  • Si non, quelle est la bonne manière de l'enregistrement d'une bibliothèque de types avec un programme d'installation de windows?

Aussi, je suppose que dans une autre partie de cette, comment Visual Studio déterminer comment enregistrer la bibliothèque de types? (Edit: regarde l' article de MSDN library sur typelib enregistrement a les noms des clés nécessaires, mais j'ai encore besoin de comprendre comment obtenir l'uuid de l'. (C'est à partir de cet article de blog sur la bibliothèque de types et de COM inscription par Larry Osterman.) ) Lire un peu plus, Il peut tomber à m'inscrire ces bits manuellement, mais je ne l'espère pas...

J'ai évalué la sortie de regasm /regfile:MyDll.dll MyDll.dll. Il semble que ces sont les mêmes touches que wix génère de la dll. Regasm l'autre mode, regasm /tlb:<filename> génère et enregistre la bibliothèque de types pour l'assemblée, mais,

/regfile[:nom de fichier] Générer un fichier reg avec le nom spécifié au lieu d'enregistrer les types. Cette option ne peut pas être utilisé avec l'option /u ou /tlb options

semble que le /regfile commutateur est incompatible avec l' /tlb basculer. Khaaaaaaaan!

Mise à jour: Il semble que vous n'avez pas besoin d'inclure l' .fichier tlb. Selon ce post sur wix de la bibliothèque de types d'élément, une MSI peut créer/enregistrer en tant que partie du processus d'installation. Il s'agit de la configuration de la WiX document fait installer en obtenant le droit d'attributs.

J'ai découvert plus tard que vous pouvez obtenir le droit d'attributs à l'aide de la chaleur sur la .tlb directement! Voir ce DONC, la question pour plus d'informations.

11voto

CheGueVerra Points 3580

Vous devez utiliser la Chaleur (WIX 3.0) situé dans le répertoire bin de la version que vous utilisez. Jetez un oeil à ce blog, nous l'utilisons ici pour vous inscrire tous nos objets COM, par la création d'un wix fragment...

quelque chose comme

la chaleur de fichier MyComExposedLibrary.dll -hors MyComExposedLibrary.wxs

Après, la lecture de votre edit, je voudrais créer une base de msi avec wix qui installe l'objet com uniquement, voir si cela fonctionne ... alors vous savez quel champ de bataille pour attaquer ...

5voto

hurcane Points 655

J'ai récemment rencontré ce problème, et la solution la plus simple que j'ai pu trouver les étapes suivantes sur l'ordinateur de développement:

  1. Exécuter: Regasm MyDLL.dll /tlb:Madll.tlb
  2. Exécuter: la Chaleur de fichier MyDLL.dll -hors Madll-1.wxs
  3. Exécuter: Chaleur fichier Madll.tlb -out Madll-2.wxs

Madll-2.wxs contient un <Typelib> de l'élément que vous souhaitez copier et le nid à l'intérieur de l' <File> élément qui a été généré dans Madll-1.wxs. Cela vous permettra de compléter <Component> élément que vous pouvez utiliser dans le projet de l'installateur.

2voto

Wim Coenen Points 41940

Pour extraire la COM de l'information, de suif va utiliser la regasm.exe l'outil fourni avec l' .NET framework. Il est probable que visual studio utilise le même outil pour enregistrer les assemblées lorsque vous activez l'option "enregistrer pour COM interop".

La différence est que suif utilisera le regasm /regfile commutateur pour envoyer des informations à un .reg fichier au lieu de l'inscription de l'assemblée. Malheureusement, le .reg fichier généré par regasm.exe n'est pas complète. Il saute de la bibliothèque de types, les candidatures qu'il ne fait qu'écrire dans le registre pendant un enregistrement. C'est peut être un bug dans regasm.

Pour obtenir votre installateur de travail, vous avez trois options:

  1. Ajouter les clés de registre manquantes à l' suif de sortie manuellement. Le suif la sortie est prévu pour être édité manuellement et enregistrés avec votre d'autres wxs fichiers de toute façon. Vous semblez essayer d'pleinement de générer automatiquement un travail wxs fichier mais je crois que c'était jamais un objectif de conception de suif.

  2. Utiliser une action personnalisée pour invoquer regasm de votre installateur. C'est un peu mal parce que vous risquez de perdre une partie de la forte transactionnelle garanties fournies par le moteur windows installer. Je pense à des restaurations déclenchée par un échec à mi-chemin au cours de l'installer ici.

  3. Éviter l'enregistrement complètement par faisant usage de l'inscription-gratuit COM. Cela nécessitera la création d' les fichiers manifest pour le l'application et la bibliothèque COM.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X