Verwenden einer COM-DLL aus C # ohne Typbibliothek
Ich muss eine COM-Komponente (eine DLL) verwenden, die vor langer Zeit in Delphi entwickelt wurde. Das Problem ist: Die DLL enthält keine Typbibliothek ... und jedes Interop-Feature (z. B. TlbImp) in .NET scheint auf TLBs zu beruhen. Die Komponente wird hier seit vielen Jahren ohne Probleme in Delphi-Programmen verwendet, da "die Verwendung von COM-Objekten aus Delphi kein großes Problem darstellt, da wir die Schnittstellen kennen" (Zitat Delphi-Entwickler).
Gibt es eine Möglichkeit, diese DLL von C # ohne TLB zu verwenden? Ich habe versucht, die DLL als nicht verwaltet zu verwenden, aber die einzige Methode, die exportiert wird, istDllUnregisterServer
, DllRegisterServer
, DllCanUnloadNow
undDllGetClassObject
. Ich kenne die Namen der Klassen und Funktionen, die ich verwenden werde, wenn dies hilfreich sein kann.
AKTUALISIEREN: Ich habe versucht, Jeffs Vorschlag umzusetzen, erhalte jedoch den folgenden Fehler:
"Das COM-Objekt vom Typ 'ComTest.ResSrvDll' konnte nicht in den Schnittstellentyp 'ComTest.IResSrvDll' umgewandelt werden. Dieser Vorgang ist fehlgeschlagen, weil der Aufruf von QueryInterface für die COM-Komponente für die Schnittstelle mit IID '{75400500-939F-11D4-9E44-0050040CE72C} 'ist aufgrund des folgenden Fehlers fehlgeschlagen: Keine solche Schnittstelle unterstützt (Ausnahme von HRESULT: 0x80004002 (E_NOINTERFACE)). "
Das habe ich getan:
Ich habe diese Schnittstellendefinition von einem der Delphi-Typen bekommen:
<code>unit ResSrvDllIf; interface type IResSrvDll = interface ['{75400500-939F-11D4-9E44-0050040CE72C}'] procedure clearAll; function ResObjOpen(const aClientID: WideString; const aClientSubID: WideString; const aResFileName: WideString; aResShared: Integer): Integer; {safecall;} ... end; implementation end. </code>
Daraus habe ich diese Schnittstelle gemacht
<code>using System.Runtime.InteropServices; namespace ComTest { [ComImport] [Guid("75400500-939F-11D4-9E44-0050040CE72C")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IResSrvDll { int ResObjOpen(string aClientID, string aClientSubID, string aResFileName, int aResShared); } } </code>
Und diese Coclass (habe die Anleitung von den Delphi-Jungs bekommen)
<code>using System.Runtime.InteropServices; namespace ComTest { [ComImport] [Guid("75400503-939F-11D4-9E44-0050040CE72C")] public class ResSrvDll { } } </code>
AKTUALISIEREN
Die Lösung von Jeff ist der Weg, es zu tun. Es ist jedoch zu beachten, dass die Schnittstellendefinition mit den COM-Komponenten übereinstimmen mussgenau! dh gleiche Reihenfolge, gleiche Namen usw.