首頁 >後端開發 >C++ >如何在 C# 和 C DLL 之間有效率地傳遞字串?

如何在 C# 和 C DLL 之間有效率地傳遞字串?

Patricia Arquette
Patricia Arquette原創
2025-01-01 01:19:091025瀏覽

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

在C# 和C DLL 之間傳遞字串:一個最小範例

在此查詢中,開發人員努力在C# 和C之間傳遞字串DLL。對他們的程式碼的分析揭示了阻礙他們努力的一個基本問題:C std::string 和 C# 字串在互通邊界處不相容。

他們定義的 C DLL 函數:

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

無法從 C# 直接存取。這是因為 std::string 不是互通友善的資料類型,不應跨越互通邊界傳遞。

要解決此問題,開發人員必須使用替代的互通友善資料類型。常見的方法是利用以 null 結尾的字元數組,因為這些可以在不同的程式語言之間輕鬆編組。這是他們的C 程式碼的修改版本:

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
    }
}

該函數採用三個參數:兩個輸入字元陣列(str1 和str2)和一個結果字元陣列(*result),該陣列將被分配並返回

在C# 中,可以相應調整代碼:

[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());

此代碼分配一個StringBuilder容量為 10 個字符,並將其作為結果參數傳遞給 C 函數。函數執行後,連接的字串將在 StringBuilder 中可用。

透過利用這種方法,開發人員確保使用互通相容的資料類型傳遞和傳回字串,從而解決了先前發生的 System.AccessViolationException .

以上是如何在 C# 和 C DLL 之間有效率地傳遞字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn