37 votes

Comment enregistrer un fichier DLL Win32 COM dans WiX 3?

J'ai trouvé un exemple d'enregistrement de DLL, Enregistrement d'un assembly pour COM Interop dans un fichier MSI avec le jeu d'outils XML Windows Installer. et WiX se plaint de l'attribut "AssemblyRegisterComInterop".

J'ai supprimé cela et changé l'attribut "Assembly" en win32, et il dit que je dois spécifier l'attribut AssemblyManifest, mais que dois-je y mettre?

44voto

Troy Howard Points 1798

La façon la plus simple (et Rob M coup de gueule et de s'extasier sur la façon dont cela est faux), c'est juste pour utiliser SelfRegCost=1 sur le tag de la DLL.

C'est faux, car nous devrions être explicitement le contrôle de l'enregistrement de la DLL, ne permettant pas simplement d'exécuter du code arbitraire via DllRegisterServer. La théorie étant que d'une DLL n'ont rien à faire au-delà de mettre les entrées appropriées dans le registre lors de la DllRegisterServer est appelé. Malheureusement, beaucoup d'entre eux de faire plus que cela, de sorte que l'auto-inscription sera peut-être la seule façon d'obtenir votre installer pour travailler.

Il est faux aussi, car cela signifie que l'installation de Windows système ne sais rien à propos de ces clés de registre, et ce qui devrait et ne devrait pas être là. Cela signifie que la réparation ne fonctionnera pas, et, éventuellement, de l'onu-l'installation ne nettoyer correctement, etc.

Sinon, vous pouvez générer approprié WiX code en pointant heat.exe lors de votre fichier DLL, et l'intégration de sa sortie dans votre WiX projet. Vous obtiendrez une variété de Classe, ProgID, bibliothèque de types, de Registre et de balises. Vous devrez peut-être modifier manuellement la sortie pour la compiler.

J'espère que ça aide.

26voto

Rob Mensching Points 20732

Ce n'est pas seulement moi qui déclamerai et commenterai à quel point SelfReg est mauvais. Le SDK MSI vous donne une liste de sept raisons pour lesquelles ne pas utiliser SelfReg .

Exemple:

 <Component Id="Component" Guid="*">
    <File Source="ComServer.dll">
        <Class Id="PUT-CLSID-HERE" Context="InprocServer32" ThreadingModel="apartment" Description="Your server description">
            <ProgId Id="Your.Server.1" Description="Your ProgId description">
                <ProgId Id="Your.Server" Description="Your ProgId description" />
            </ProgId>
        </Class>

        <Class Id="PUT-PROXY-CLSID-HERE" Context="InprocServer32" ThreadingModel="both" Description="Your server Proxies, assuming you have them">
            <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface1" />
            <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface2" />
            <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface3" />
            <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface4" />
        </Class>
    </File>
</Component>
 

En fin de compte, la réponse de Troy est tout à fait correcte.

14voto

Adam Tegen Points 8563

Vous pouvez essayer d'utiliser le programme heat.exe, puis référencer le fragment dans votre code wix.

  heat.exe file <filename> -out <output wxs file>
 

Un péché:

  heat.exe file my.dll -out my.wxs
 

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