2009-08-11 13 views
0

J'ai un fichier .exe m'a donné qui a cours COM à l'intérieur - ce sont de C++, .net pas ComVisible typesen utilisant des classes dans un COM exe de .Net

Je voudrais utilisez ces classes dans mon projet .net, mais je ne peux pas ajouter de référence à l'exe; quand j'essaye je reçois

DIALOG BOX: 

--------------------------- 
Microsoft Visual Studio 
--------------------------- 
A reference to 'C:\Program Files\blah\blah.exe' 
could not be added. Please make sure that the 
file is accessible, and that it is a valid 
assembly or COM component. 
--------------------------- 
OK 
--------------------------- 

tlbimp échoue également;

TLBIMP OUTPUT: 

> tlbimp blah.exe 

Microsoft (R) .NET Framework Type Library 
to Assembly Converter 3.5.30729.1 

Copyright (C) Microsoft Corporation. All rights reserved. 

TlbIml : error TI0000 : The input file 
'c:\program files\blah\blah.exe' is not 
a valid type library 

Mais il semble vraiment qu'il existe des classes COM disponibles; dans ma ruche HKEY_CLASSES_ROOT, je peux voir les entrées pour les différentes classes COM;

REGISTRY ENTRY: 

\HKEY_CLASSES_ROOT 
    \CLSID 
     \{456B14EA-4CCC-11D4-BB91-0020AFC894E9} 
      @="COM.Classname" 
      \InprocHandler32 
       @="ole32.dll" 
      \LocalServer32 
       "LocalServer32"=hex(7) ... 
       @="C:\\PROGRA~2\\blah\blah.exe" 
      \ProgID 
       @="COM.Classname" 

Quelqu'un at-il une idée sur la façon, et même si, je peux utiliser ces classes COM à partir d'un projet .net?

+0

avez-vous essayé la liaison tardive? –

+0

La liaison tardive vaut probablement la peine d'être essayée. Sur une note différente, 'tlbimp' vous dit le problème. C'est un exécutable, pas une bibliothèque de type (dll). –

Répondre

3

Il existe trois méthodes de distribution d'une bibliothèque de types: soit séparément dans un fichier .tlb, soit en tant que ressource incorporée dans un fichier .dll ou .exe. Cependant, il n'est pas obligatoire de distribuer un fichier de bibliothèque de types avec un composant COM.

Habituellement, il y aurait une clé de registre TypeLib sous le HKCR \ CLSID {CLSID}, qui aurait une valeur par défaut contenant l'ID typelib. (oleview.exe est très utile pour traquer ces entrées de registre). Si votre registre ne contient pas de clé TypeLib, il est probable que votre composant n'a pas été distribué avec une bibliothèque de types. Tlbimp.exe peut importer n'importe quelle ressource de bibliothèque de type incorporée dans des fichiers .dll ou .exe. L'erreur signalée ci-dessus m'indique qu'il n'y a pas de bibliothèque de types incorporée dans votre exécutable. Vous pouvez le confirmer en visualisant l'exe en utilisant une vue des ressources. J'ai oublié le nom de la visionneuse de ressources Windows SDK, mais vous pouvez en trouver un gratuitement ici: MiTec Exe Explorer

Si l'exe n'a pas de ressource TYPELIB, vous ne pouvez pas créer de bibliothèque .net interop. Votre seule option est alors de contacter le fabricant du composant et demander un type lib. Si cela n'est pas possible, vous pouvez utiliser la liaison tardive pour appeler le composant.