Heim >Backend-Entwicklung >C++ >Wie kann ich mit P/Invoke von C# aus auf C-Klassen zugreifen?
Zugriff auf C-Klassen in C#-Code über DLL
Bei der Verbindung mit einer C-DLL aus C#-Code treten Einschränkungen auf, wenn versucht wird, direkt auf Klassen zuzugreifen innerhalb der DLL definiert. Trotz der Fähigkeit von P/Invoke, Funktionen verfügbar zu machen, basieren Funktionen innerhalb von Klassen auf nicht statischen Mitgliedsvariablen, was die Erstellung einer Instanz erfordert.
P/Invoke und indirekter Zugriff
Während direkt Da ein Klassenzugriff nicht möglich ist, kann P/Invoke indirekt für den Zugriff auf Klassenmitglieder verwendet werden. Der Ansatz beinhaltet die Erstellung von Nicht-Mitgliedsfunktionen, die die Klassenmitgliedsfunktionen aufrufen.
Beispielcode
Betrachten Sie den folgenden C-Code:
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; }
Hier macht der C-Code die Klasse Foo über Nicht-Member-Funktionen verfügbar.
C# Schnittstellen
In C# kann P/Invoke auf diese Funktionen zugreifen:
[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);
C#-Code muss jetzt IntPtr-Werte verwalten, die der Einfachheit halber in eine Wrapper-Klasse eingeschlossen werden können.
Alternativer Ansatz
Wenn direktes Eigentum am C-Code besteht Ist dies nicht möglich, kann eine separate DLL erstellt werden, um die ursprüngliche DLL zu umschließen und eine P/Invoke-Ebene bereitzustellen, wodurch die C#-Code-Interaktion mit der C-Klasse vereinfacht wird.
Das obige ist der detaillierte Inhalt vonWie kann ich mit P/Invoke von C# aus auf C-Klassen zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!