C# 和C DLL 之間的介面字串
將字串操作封裝在C DLL 中並從C# 呼叫它看起來很簡單;然而,跨越互通性邊界傳遞字串是一個挑戰。本文探討了此類交換中涉及的複雜性,並提供了無縫字串傳輸的解決方法。
陷阱
直接傳遞 C 標準函式庫字串 (std::string)跨越 C#/.NET 邊界是不相容的。這是因為 C# 沒有提供 std::string 的對應項。因此,嘗試執行互通性會失敗,並出現 System.AccessViolationException。
解決方案:可互通的字串
要克服此障礙,我們必須在以下位置使用可互通的字串類型邊界。其中一個選項是空終止字元數組,它可以在 C 和 C# 中方便地處理。這種方法需要在同一模組內分配和釋放記憶體。
將字串從 C# 傳遞到 C
考慮以下接受以 null 結尾的字元陣列的 C 函數:
void foo(const char *str) { // ... }
在 C#中,我們可以將互通函數宣告為如下所示:
[DllImport("...")] static extern void foo(string str); // ... foo("bar");
在這種情況下,C# 編譯器會自動將託管字串(「bar」)編組到以null 結尾的字元數組中,該數組將傳遞給C 函數。
將字串從C 傳遞到C#
另一方面,C 函數可以將字串寫入由C# 呼叫方:
void foo(char *str, int len) { // Perform operations within len characters of str }
在C# 中:
[DllImport("...")] static extern void foo(StringBuilder str, int len); // ... StringBuilder sb = new StringBuilder(10); foo(sb, sb.Capacity);
這裡,C# 分配一個StringBuilder對象,並透過 StringBuilder 和 Capacity 參數將其內部緩衝區公開給 C 函數。然後,C 函數可以用最多 Capacity 字元填滿緩衝區。
結論
透過採用可互通的字串類型,字串可以在C# 和C DLL 之間無縫傳遞,提供一種跨不同語言和平台交換文字資料的便利機制。
以上是如何在 C# 和 C DLL 之間無縫傳遞字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!