2010-09-11 4 views
1

J'ai une bibliothèque de classe vanilla .net qui contient des types qui sont [ComVisible] et l'assembly lui-même est marqué "Register for COM Interop". J'essaye de construire un programme d'installation de WIX pour l'application qui devra non seulement copier l'assembly .net dans INSTALLATIONDIR sur la machine cible, mais également faire le travail d'enregistrement de l'objet pour que certaines applications VB6 héritées puissent être utilisées de l'assemblage .net.en utilisant wix pour enregistrer l'assembly .Net marqué pour COM interop

J'ai utilisé heat.exe (la tâche du fichier thermique plus précisément) pour récolter un fragment que j'ai inclus via un componentGroupRef dans mon fichier wix principal. Ma question est de savoir si le fichier que heat.exe recueille est le fichier .tlb sorti par ma bibliothèque de classes ou la DLL elle-même? Si j'utilise heat.exe sur le .tlb, je n'obtiens aucun élément de registre dans le fragment mais je le fais avec la DLL. Si je devais utiliser la DLL, quel rôle joue le .tb dans ce processus?

Im en utilisant la tâche de chaleur ci-dessous dans msbuild

<HeatFile 
    NoLogo="true" 
    ToolPath="$(WixToolPath)" 
    TreatWarningsAsErrors="false" 
    AutogenerateGuids="true" 
    GenerateGuidsNow="true" 
    OutputFile="$(MSBuildProjectDirectory)\fragments\DemoTypeLib.wxs" 
    File="$(SolutionDir)DemoClassLibrary1\bin\Debug\DemoClassLibrary1.dll" 
    ComponentGroupName="DemoTypeLibComponent" 
    PreprocessorVariable="var.DemoClassLibrary1.TargetDir" 
    SuppressCom="false" 
    DirectoryRefId="INSTALLLOCATION" 
    SuppressRegistry="false" 
    SuppressRootDirectory="true" /> 

Répondre

1

Juste expédier le fragment avec la DLL et le COM pour elle. Vous n'avez pas besoin du TLB.

+0

Bonjour Christopher. D'après votre réponse, je suppose que j'ai besoin d'utiliser la chaleur pour récolter la DLL plutôt que la tlb? Et je viens d'ajouter le fragment généré à mon fichier wix principal? –

+0

Correct. Un couple de pièges à surveiller. Parfois Heat (et les outils d'autres fournisseurs similaires) ne parviennent pas à extraire certaines des valeurs de registre COM nécessaires. Cela semble presque impossible en fonction de la quantité de métadonnées dans un assembly .NET, mais cela est dû au fait que tout code utilisateur de votre classe n'est pas appelé lorsque vous faites un gacutil/regfiles. Voir la rubrique d'aide de MSDN gacutil pour la preuve de cela. –

+0

Si cela ne fonctionne pas sur votre machine cible, utilisez un programme comme InstallWatch pour prendre un instantané du registre; exécutez gacutil et effectuez un autre rapport instantané/différence pour voir les modifications apportées. Si vous trouvez quelque chose de pertinent, créez-le manuellement dans votre fragment et reconstruisez/redéployez. COM est une douleur et parfois difficile mais une fois qu'il se stabilise, ça devrait aller. –

2

Vous devez récupérer les fichiers .tlb et .dll. Certains outils peuvent uniquement utiliser l'enregistrement de la DLL, mais d'autres, comme les langages de script, ont également besoin de la bibliothèque de types. Il suffit de chauffer les deux et d'inclure les deux sorties dans votre projet final. Par exemple, win32com de python et les bibliothèques Win32 :: OLE de Perl ont toutes deux besoin de la bibliothèque de types enregistrée pour fonctionner.

+1

Je peux ajouter Dynamics NAV (a.k.a. Navision à cette liste) – forki23

Questions connexes