在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中文網其他相關文章!