Heim >Backend-Entwicklung >C++ >Wie kann ich Strings nahtlos zwischen C# und einer C-DLL übergeben?
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!