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.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage