Heim >Backend-Entwicklung >C++ >Wie kann ich über C# auf eine C-DLL-Klasse mit Mitgliedsvariablen und nichtstatischen Methoden zugreifen?

Wie kann ich über C# auf eine C-DLL-Klasse mit Mitgliedsvariablen und nichtstatischen Methoden zugreifen?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-28 21:49:11162Durchsuche

How Can I Access a C   DLL Class with Member Variables and Non-Static Methods from C#?

Zugriff auf eine C-DLL-Klasse in C#-Code

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:

  1. Erstellen Sie Nicht-Mitgliedsfunktionen für jede Klassenmitgliedsfunktion und rufen Sie die Mitgliedsfunktionen auf.
  2. Verwenden Sie P/Invoke, um diese Nicht-Mitgliedsfunktionen verfügbar zu machen C#.

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!

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