Question

Je suis en train de produire un emballage C # pour un objet COM que je (nom SC_COM.dll), mais ai des problèmes avec reliant Visual Studio 2008 (sous Vista). Je dois faire sans enregistrement avec la DLL COM - Je utilise un fichier manifeste pour faire savoir Visual Studio à propos SC_COM.dll, et qui semble fonctionner. Je TblImp.exe pour générer une bibliothèque de type (SC_COMtlb.dll) que je fais référence dans Visual Studio 2008, je peux le faire avec la liaison anticipée DLL que j'ai besoin. Les DLL sont à la fois dans le même répertoire que le manifeste et l'exécutable.

Voici la question: Quand j'instancier l'objet et essayer de composer l'un de ses méthodes en C #, il jette l'erreur suivante:

  

Erreur détectée: impossible de lancer un objet COM de type 'SC_COMtlb.SCAccessObjClass' à l'interface de type "SC_COMtlb.ISCUploader. Cette opération a échoué parce que l'appel QueryInterface sur le composant COM pour l'interface avec IID '{C677308A-AC0F-427D-889A-47E5DC990138} a échoué en raison de l'erreur suivante: cette interface pris en charge (Exception de HRESULT: 0x80004002 (E_NOINTERFACE)) .

Je ne suis pas tout à fait certain de ce que cela signifie erreur - j'ai fait une recherche sur le code d'erreur, et il semble être une erreur C # relativement générale. Donc, vais-je sur la liaison de l'objet COM ici de la mauvaise façon, ou est-il une autre étape importante que je peux être absent?

Je tiens à souligner que je suis sans doute pas tout à fait sûr de savoir comment la bibliothèque de type (S \ C_COMtlb.dll) que je produisais sait où la DLL COM réelle est, car il est pas inscrit sur le système - je suppose qu'il semble juste dans le même répertoire. Serait-ce potentiellement la question, et si oui, comment puis-je mieux relier les deux?

Était-ce utile?

La solution

Essayez d'ajouter ceci à votre App.exe.manifest:

<comInterfaceExternalProxyStub 
  name="ISCUploader" 
  iid="{C677308A-AC0F-427D-889A-47E5DC990138}"
  proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
  baseInterface="{00000000-0000-0000-C000-000000000046}"
  tlbid = "{PUT-YOUR-TLB-GUID-HERE}" />

Où tlbid se trouve à partir de votre Visual Studio généré Native.Namespace.Assembly.Name.manifest, qui ressemble à ceci:

<typelib tlbid="{A-GUID-IS-HERE--USE-IT}"
  version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />

je frappais ma tête contre cela pour un certain temps, mais j'ai trouvé ces références utiles et rapiécé ensemble et cela fonctionne pour moi:

Autres conseils

le code d'erreur signifie que Visual Studio pense qu'un certain objet est censé mettre en œuvre une certaine interface, mais quand j'essaye de « connecter » à cette interface l'objet répond qu'il ne sait pas à ce sujet.

Je suppose que le problème est en SC_COM.dll. Tlbimp.exe extrait des informations de classe et d'interface à partir des métadonnées stockées dans la DLL et construit des emballages pour la classe.

Par exemple, si SC_COM est écrit en C ++, cela pourrait se produire si le créateur de la DLL indiquée dans le fichier IDL qu'une classe implémente cette interface, mais le code réel ne prend pas en charge cette interface.

Voici une autre source commune de problèmes cette DLL peut avoir: parfois, vous avez une classe qui implémente une interface ISomething2 qui dérive d'une interface ISomething, mais la mise en œuvre de la classe à ne reconnaître ISomething2. Si vous implémentez une interface dérivée, vous devez reconnaître son interface de base aussi bien. Ceci est une erreur courante.

Avez-vous (et le contrôle) le code source de la DLL?

Quelle version de Windows? Depuis Windows Vista, un manifeste interne remplace un manifeste externe. Par défaut, executables C # ont manifeste internes, ce qui signifie que votre fichier whatever.exe.manifest sera ignoré.

Si vous allez à la page de propriétés pour votre C # EXE, vous verrez qu'il ya une section « Icône et manifeste » sur l'onglet « Application ». Set « Manifest » au nom de votre fichier manifeste, et il sera intégré au lieu de celui par défaut.

Si cela ne fonctionne pas, vous pourriez avoir à faire quelques étapes de post-construction avec mt.exe afin de fusionner votre manifeste externe avec la valeur par défaut d'un interne et de remettre le manifeste fusionné dans le fichier .EXE.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top