將字串從C# 傳遞到C DLL 並傳回
當嘗試在C# 和C 之間傳遞字串時,開發人員常會遇到困難。在本文中,我們深入研究這個問題並提供一個簡潔的解決方案。
問題
考慮以下程式碼,其中C 定義了一個連接字串的函數:
extern "C" { string concat(string a, string b){ return a + b; } }
在C# 中,該函數調用使用interop:
[DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)] static extern string concat(string a, string b);
但是,這種方法會導致System.AccessViolationException。
解決方案
問題在於 C 的不相容std::string 具有互通性邊界。要解決此問題,必須在邊界處使用互通友善的類型,例如以 null 結尾的字元陣列。
將字串從C# 傳遞到C
For字串從C# 傳遞到C ,可以修改C 函數:
void foo(const char *str) { // do something with str }
且在C#:
[DllImport("...", CallingConvention = CallingConvention.Cdecl) static extern void foo(string str);
將字串從C 傳遞到C#
對於從C 傳遞到C# 的字串,C 函數變成:
void foo(char *str, int len) { // write no more than len characters into str }
在C# 中:
[DllImport("...", CallingConvention = CallingConvention.Cdecl) static extern void foo(StringBuilder str, int len);
透過遵守這些準則,開發人員可以在C# 和C DLL 之間無縫傳遞字串。
以上是如何在 C# 和 C DLL 之間無縫傳遞字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!