Heim >Backend-Entwicklung >C++ >Wie kann ich Strings nahtlos zwischen C# und einer C-DLL übergeben?

Wie kann ich Strings nahtlos zwischen C# und einer C-DLL übergeben?

DDD
DDDOriginal
2025-01-05 03:53:39968Durchsuche

How Can I Seamlessly Pass Strings Between C# and a C   DLL?

Interface von Strings zwischen C# und C-DLL

Das Einkapseln von String-Manipulationen innerhalb einer C-DLL und deren Aufruf aus C# kann unkompliziert erscheinen; Die Übergabe von Zeichenfolgen über die Interoperabilitätsgrenze hinaus stellt jedoch eine Herausforderung dar. Dieser Artikel untersucht die Komplexität eines solchen Austauschs und bietet einen Workaround für eine nahtlose String-Übertragung.

Die Gefahr

Direkte Übergabe von C-Standardbibliotheksstrings (std::string) über die C#/.NET-Grenze hinweg ist inkompatibel. Dies liegt daran, dass C# kein Gegenstück für std::string bereitstellt. Infolgedessen schlagen Versuche, Interoperabilität durchzuführen, mit einer System.AccessViolationException fehl.

Die Lösung: Interoperable Strings

Um dieses Hindernis zu überwinden, müssen wir interoperable String-Typen verwenden die Grenze. Eine solche Option sind nullterminierte Zeichenarrays, die sowohl in C als auch in C# bequem verarbeitet werden können. Dieser Ansatz erfordert das Zuweisen und Freigeben von Speicher innerhalb desselben Moduls.

Übergabe von Strings von C# an C

Betrachten Sie die folgende C-Funktion, die ein auf Null endendes Zeichenarray akzeptiert:

void foo(const char *str) {
  // ...
}

In C# können wir eine Interop-Funktion als deklarieren folgt:

[DllImport("...")]
static extern void foo(string str);

// ...

foo("bar");

In diesem Szenario Marshallt der C#-Compiler die verwaltete Zeichenfolge („bar“) automatisch in ein nullterminiertes Zeichenarray, das an die C-Funktion übergeben wird.

Übergabe von Strings von C an C#

Andererseits können C-Funktionen Strings in von C# zugewiesene Puffer schreiben. Aufrufer:

void foo(char *str, int len) {
  // Perform operations within len characters of str
}

Und in C#:

[DllImport("...")]
static extern void foo(StringBuilder str, int len);

// ...

StringBuilder sb = new StringBuilder(10);
foo(sb, sb.Capacity);

Hier weist C# ein StringBuilder-Objekt zu und stellt seinen internen Puffer über die StringBuilder- und Capacity-Parameter der C-Funktion zur Verfügung. Die C-Funktion kann dann den Puffer mit bis zu Kapazitätszeichen füllen.

Fazit

Durch die Verwendung interoperabler Zeichenfolgentypen können Zeichenfolgen nahtlos zwischen C#- und C-DLLs übergeben werden. Bereitstellung eines praktischen Mechanismus zum Austausch von Textdaten über verschiedene Sprachen und Plattformen hinweg.

Das obige ist der detaillierte Inhalt vonWie kann ich Strings nahtlos zwischen C# und einer C-DLL übergeben?. 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