Heim >Backend-Entwicklung >C++ >Wie kann ich mithilfe der DLL-Integration von C# aus auf C-Klassen zugreifen?
Zugriff auf C-Klassen in C#-Code über DLL-Integration
Bei der Integration von C#-Code in eine bereits vorhandene C-DLL wird der Zugriff auf in der definierte Klassen DLL kann eine Herausforderung darstellen. Während P/Invoke Ihnen die Schnittstelle zu Funktionen in der DLL ermöglicht, unterstützt es natürlich nicht den Zugriff auf Klassen.
Um diese Einschränkung zu überwinden, können Sie einen indirekten P/Invoke-Ansatz verwenden. Dazu gehört das Erstellen von Nicht-Member-Funktionen für jede Member-Funktion der Zielklasse, die den Member-Funktionsaufruf umschließt.
Betrachten Sie beispielsweise eine C-Klasse Foo mit einer Member-Funktion Bar():
class Foo { public: int Bar(); };
Um in C# auf Foo zuzugreifen, würden Sie drei externe Funktionen erstellen:
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# können diese Funktionen sein P/Invoked:
[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);
Dieser Ansatz bietet zwar Zugriff auf die C-Klasse, führt jedoch einen undurchsichtigen IntPtr ein, den Sie verwalten müssen. Um eine benutzerfreundlichere Schnittstelle zu erstellen, können Sie um diesen Zeiger herum eine C#-Wrapper-Klasse erstellen, die die notwendigen Vorgänge kapselt.
Auch wenn Sie keinen direkten Zugriff auf den C-Code haben, können Sie dennoch eine separate Klasse erstellen DLL, die die ursprüngliche DLL umschließt, eine P/Invoke-Ebene bereitstellt und eine Schnittstelle verfügbar macht, die besser für C#-Code geeignet ist.
Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe der DLL-Integration von C# aus auf C-Klassen zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!