Heim >Backend-Entwicklung >C++ >Wie übergebe ich Strings effizient zwischen C# und einer C-DLL?

Wie übergebe ich Strings effizient zwischen C# und einer C-DLL?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-01 01:19:091063Durchsuche

How to Efficiently Pass Strings Between C# and a C   DLL?

Übergabe von Zeichenfolgen zwischen C# und C-DLL: Ein Minimalbeispiel

In dieser Abfrage hat ein Entwickler Schwierigkeiten, Zeichenfolgen zwischen C# und einer C-DLL zu übergeben DLL. Die Analyse ihres Codes offenbart ein grundlegendes Problem, das ihre Bemühungen behindert: Inkompatibilität zwischen C std::string und C#-Strings an der Interop-Grenze.

Die von ihnen definierte C-DLL-Funktion:

extern "C" {
    string concat(string a, string b){
        return a + b;
    }
}

Der direkte Zugriff über C# ist nicht möglich. Dies liegt daran, dass std::strings keine interopfreundlichen Datentypen sind und nicht über die Interop-Grenze übergeben werden sollten.

Um dieses Problem zu beheben, muss der Entwickler alternative interopfreundliche Datentypen verwenden. Ein gängiger Ansatz besteht darin, nullterminierte Zeichenarrays zu nutzen, da diese problemlos zwischen verschiedenen Programmiersprachen gemarshallt werden können. Hier ist eine modifizierte Version ihres C-Codes:

extern "C" {
    void concat(char* str1, char* str2, char** result)
    {
        int len1 = strlen(str1);
        int len2 = strlen(str2);
        int resultSize = len1 + len2 + 1; //null-terminator included
        *result = (char*)malloc(resultSize); //allocate memory for the result string
        strcpy(*result, str1);
        strcat(*result, str2); //append str2 to str1
    }
}

Diese Funktion benötigt drei Parameter: zwei Eingabezeichen-Arrays (str1 und str2) und ein Ergebnis-Zeichen-Array (*result), das zugewiesen und an zurückgegeben wird Aufrufer.

In C# kann der Code entsprechend angepasst werden:

[DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern void concat(string str1, string str2, StringBuilder result);

...

StringBuilder result = new StringBuilder(10);
concat("a", "b", result);
Console.WriteLine(result.ToString());

Dieser Code weist einen StringBuilder mit einer Kapazität von zu 10 Zeichen und übergibt ihn als Ergebnisparameter an die C-Funktion. Nachdem die Funktion ausgeführt wurde, ist die verkettete Zeichenfolge im StringBuilder verfügbar.

Durch die Verwendung dieses Ansatzes stellt der Entwickler sicher, dass Zeichenfolgen mit interopkompatiblen Datentypen übergeben und zurückgegeben werden, wodurch die zuvor aufgetretene System.AccessViolationException aufgelöst wird .

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