首頁 >後端開發 >C++ >如何在 C# 和 C DLL 之間無縫傳遞字串?

如何在 C# 和 C DLL 之間無縫傳遞字串?

DDD
DDD原創
2025-01-05 03:53:39963瀏覽

How Can I Seamlessly Pass Strings Between C# and a C   DLL?

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

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