Heim >Backend-Entwicklung >C++ >Wie kann ich mit P/Invoke von C# aus auf C-Klassen zugreifen?

Wie kann ich mit P/Invoke von C# aus auf C-Klassen zugreifen?

Linda Hamilton
Linda HamiltonOriginal
2025-01-05 02:42:38178Durchsuche

How Can I Access C   Classes from C# Using P/Invoke?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn