Frage

Ich versuche, einen C # Wrapper für ein COM-Objekt zu erzeugen, das ich (mit dem Namen SC_COM.dll), aber einige Probleme habe Verknüpfung mit Visual Studio 2008 (mit Vista). Ich brauche diese Registrierung frei mit dem COM-DLL zu tun - ich bin eine Manifest-Datei mit Visual Studio über SC_COM.dll wissen zu lassen, und das scheint zu funktionieren. Ich benutzte TblImp.exe eine Typbibliothek (SC_COMtlb.dll) zu erzeugen, die ich in Visual Studio Referenzierung 2008 so kann ich früh mit dem DLL-Bindung, die ich brauche. Die DLLs sind beide im selben Verzeichnis wie das Manifest und die ausführbare Datei.

Hier ist das Problem: Wenn ich das Objekt instanziiert und versuchen, eine seiner Methoden in C # zu nennen, es führt den folgenden Fehler:

  

Fehler erkannt: Nicht imstande, COM-Objekt des Typs ‚SC_COMtlb.SCAccessObjClass‘ zu werfen Typen ‚SC_COMtlb.ISCUploader‘ zu verbinden. Dieser Vorgang fehlgeschlagen, da der Interface-Aufruf auf der COM-Komponente für die Schnittstelle mit IID ‚{C677308A-AC0F-427D-889A-47E5DC990138}‘ aufgrund der folgenden Fehler fehlgeschlagen: Schnittstelle nicht unterstützt (Ausnahme von HRESULT: 0x80004002 (E_NOINTERFACE)) .

Ich bin nicht ganz sicher, was dieser Fehler bedeutet - ich habe eine Suche auf dem Fehlercode getan, und es erscheint ein relativ allgemein C # Fehler zu sein. So bin ich werde über das COM-Objekt in die falsche Art und Weise hier verbinden, oder gibt es einen anderen wichtigen Schritt, den ich möglicherweise fehlen?

Ich soll wohl anmerken, dass ich nicht ganz sicher bin, wie die Typenbibliothek (S \ C_COMtlb.dll), die ich produzierte weiß, wo der eigentliche COM-DLL ist, da es nicht mit dem System registriert ist - ich nehme an, es sieht einfach im selben Verzeichnis. Könnte dies möglicherweise das Problem sein, und wenn ja, wie kann ich einen Link besser, die beiden?

War es hilfreich?

Lösung

Versuchen Sie, diese zu Ihrem 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}" />

Wo TLBID können von Ihrem Visual Studio erzeugt Native.Namespace.Assembly.Name.manifest gefunden werden, wie folgt aussehen:

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

Ich schlage meinen Kopf gegen den seit geraumer Zeit, aber ich fand diese hilfreichen Hinweise und pieced es zusammen und es funktioniert für mich:

Andere Tipps

der Fehlercode bedeutet, dass Visual Studio denkt , dass ein bestimmtes Objekt sollte eine bestimmte Schnittstelle implementieren, aber wenn ich versuche, „connect“ zu dieser Schnittstelle des Objekt antwortet, dass er nicht weiß, über sie.

Ich würde vermuten, dass das Problem in SC_COM.dll ist. TlbImp.exe extrahiert Klassen- und Schnittstelleninformationen von Metadaten innerhalb der DLL gespeichert und baut Wrapper für die Klasse.

Zum Beispiel, wenn SC_COM in C ++ geschrieben wird, könnte dies geschehen, wenn der Schöpfer der DLL in der IDL-Datei angegeben, dass eine Klasse, die eine Schnittstelle implementiert, aber der eigentliche Code nicht unterstützt diese Schnittstelle.

Hier ist eine weitere häufige Ursache von Problemen diese DLL haben könnte: Manchmal haben Sie eine Klasse eine ISomething2 Schnittstelle implementiert, die von einer ISomething Schnittstelle leitet, aber die Klassenimplementierung nur ISomething2 zu erkennen. Wenn Sie eine abgeleitete Schnittstelle implementieren, müssen Sie die Basis-Schnittstelle als auch erkennen. Dies ist ein häufiger Fehler.

Haben Sie (und Kontrolle) der Quellcode für die DLL?

Welche Version von Windows? Seit Windows Vista, ein internes Manifest überschreibt einen externen Manifest. Standardmäßig hat C # Executables interne Manifeste, was bedeutet, dass Ihre whatever.exe.manifest Datei ignoriert.

Wenn Sie auf der Eigenschaftenseite für Ihre C # EXE gehen, werden Sie sehen, dass es ein „Symbol und Manifest“ auf der „Application Tab“. Set „Manifest“ an den Namen Ihrer Manifest-Datei, und es wird anstelle dem Standard eines eingebettet werden.

Wenn das nicht funktioniert, könnten Sie einig Post-Build-Schritte mit MT.EXE tun müssen, um Ihr externes Manifest mit dem Standard eines internen zu verschmelzen und das fusionierte Manifest zurück in die Exe-Datei zu setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top