Übergabe von Strings von C# an die C-DLL und zurück
Beim Versuch, Strings zwischen C# und C zu übergeben, stoßen Entwickler häufig auf Schwierigkeiten. In diesem Artikel gehen wir auf dieses Problem ein und bieten eine prägnante Lösung.
Das Problem
Betrachten Sie den folgenden Code, in dem C eine Funktion zum Verketten von Zeichenfolgen definiert:
extern "C" { string concat(string a, string b){ return a + b; } }
In C# wird die Funktion mit aufgerufen interop:
[DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)] static extern string concat(string a, string b);
Dieser Ansatz führt jedoch zu einer System.AccessViolationException.
Die Lösung
Das Problem liegt in der Inkompatibilität von C std::string mit der Interoperabilitätsgrenze. Um dieses Problem zu lösen, müssen interopfreundliche Typen an der Grenze verwendet werden, wie z. B. nullterminierte Arrays von Zeichen.
Übergabe von Strings von C# an C
Für Zeichenfolgen, die von C# an C übergeben werden, kann die C-Funktion geändert werden:
void foo(const char *str) { // do something with str }
Und in C#:
[DllImport("...", CallingConvention = CallingConvention.Cdecl) static extern void foo(string str);
Übergabe von Strings von C an C#
Für Strings, die von C an C# übergeben werden, lautet die C-Funktion wie folgt:
void foo(char *str, int len) { // write no more than len characters into str }
In C#:
[DllImport("...", CallingConvention = CallingConvention.Cdecl) static extern void foo(StringBuilder str, int len);
Durch die Einhaltung dieser Richtlinien können Entwickler Zeichenfolgen nahtlos zwischen C# übergeben und C-DLLs.
Das obige ist der detaillierte Inhalt vonWie übergebe ich Strings nahtlos zwischen C#- und C-DLLs?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!