Problem:
Verwendung von P/Invoke für den Zugriff auf Funktionen in einem C Eine DLL mit Mitgliedsvariablen und nicht statischen Methoden erfordert das Erstellen von Instanzen der definierenden Klasse. Wie kann auf diese Klasse zugegriffen werden?
Antwort:
Die direkte Verwendung einer C-Klasse in C# ist nicht möglich. Befolgen Sie stattdessen diese Schritte:
Beispiel:
class Foo { public: int Bar(); }; extern "C" Foo* Foo_Create() { return new Foo(); } extern "C" int Foo_Bar(Foo* pFoo) { return pFoo->Bar(); } extern "C" void Foo_Delete(Foo* pFoo) { delete pFoo; }
In C#:
[DllImport("Foo.dll")] public static extern IntPtr Foo_Create(); [DllImport("Foo.dll")] public static extern int Foo_Bar(IntPtr value); [DllImport("Foo.dll")] public static extern void Foo_Delete(IntPtr value);
Wrapper-Klasse:
Um die Verwendung zu vereinfachen, wickeln Sie den IntPtr-Zeiger in einen C#-Wrapper ein Klasse:
public class FooWrapper { private IntPtr _foo; public FooWrapper() { _foo = Foo_Create(); } public int Bar() { return Foo_Bar(_foo); } public void Dispose() { Foo_Delete(_foo); } }
Alternativer Ansatz:
Wenn die ursprüngliche DLL nicht geändert werden kann, erstellen Sie eine Zwischen-DLL, die die ursprüngliche DLL umschließt und die umschlossene Klasse für C# verfügbar macht. .
Das obige ist der detaillierte Inhalt vonWie kann ich über C# auf eine C-DLL-Klasse mit Mitgliedsvariablen und nichtstatischen Methoden zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!