Herausforderung der String-Interoperabilität in C#- und C-DLLs
Die nahtlose Übergabe von Strings zwischen C#- und C-DLLs hat sich für viele als Stolperstein erwiesen. Lassen Sie uns in die Feinheiten dieses Problems eintauchen und eine Lösung bereitstellen, die die persistente System.AccessViolationException beseitigt.
Das Problem
Der Kern des Problems liegt in der Unfähigkeit, dies zu tun Übergeben Sie C std::string-Objekte über die Interop-Grenze. Der Versuch, dies zu tun, wie im angegebenen C#-Code, führt zu einer Zugriffsverletzungsausnahme.
Die Lösung: Interop-freundliche Typen verwenden
Um diesen Fehler zu verhindern , müssen wir interopfreundliche Datentypen an der Interop-Grenze verwenden. Eine erste Wahl sind nullterminierte Zeichenarrays. Sie zeichnen sich aus, wenn die Speicherzuweisung und -freigabe innerhalb desselben Moduls erfolgt, wodurch die Datenübergabe von C# an C vereinfacht wird.
C-Code
void foo(const char *str) { // Perform some action on the string }
C#-Code
[DllImport("...", CallingConvention = CallingConvention.Cdecl)] static extern void foo(string str); // ... foo("bar");
Übergabe von Daten von C an C#
In Fällen, in denen der Angerufene die Zuweisung des Puffers erfordert, wird der folgende Ansatz empfohlen:
C-Code
void foo(char *str, int len) { // Write up to len characters into str }
C#-Code
[DllImport("...", CallingConvention = CallingConvention.Cdecl)] static extern void foo(StringBuilder str, int len); // ... StringBuilder sb = new StringBuilder(10); foo(sb, sb.Capacity);
Indem wir interopfreundliche Datentypen nutzen, können wir dies tun Überwinden Sie effektiv die Hürde beim String-Austausch zwischen C#- und C-DLLs und ebnen Sie so den Weg für nahtlose Kommunikation und fehlerfreien Datenfluss.
Das obige ist der detaillierte Inhalt vonWie löst man die System.AccessViolationException beim Übergeben von Zeichenfolgen zwischen C#- und C-DLLs?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!