首頁 >後端開發 >C++ >在 C# 和 C DLL 之間傳遞字串時如何解決 System.AccessViolationException?

在 C# 和 C DLL 之間傳遞字串時如何解決 System.AccessViolationException?

Barbara Streisand
Barbara Streisand原創
2025-01-05 17:08:39400瀏覽

How to Solve the System.AccessViolationException When Passing Strings Between C# and C   DLLs?

C# 和C DLL 中的字串互通性挑戰

在C# 和C DLL 之間無縫傳遞字串已被證明是許多人的絆腳石。讓我們深入研究這個問題的複雜性,並提供一個消除持久性 System.AccessViolationException 的解決方案。

問題

問題的癥結在於無法跨互通邊界傳遞 C std::string 物件。嘗試這樣做(如給定的 C# 程式碼中一樣)將導致存取衝突異常。

解決方案:使用互通友善類型

要防止此錯誤,我們必須在互通邊界使用互通友善的資料類型。一個主要的選擇是空終止字元數組。當記憶體分配和釋放發生在同一模組內時,它們表現出色,簡化了從 C# 到 C 的資料傳遞。

C 代碼

void foo(const char *str) {
    // Perform some action on the string
}

C# 代碼

[DllImport("...", CallingConvention = CallingConvention.Cdecl)]
static extern void foo(string str);

// ...

foo("bar");

將資料從 C🎜>

將資料從 🎜傳遞到C#

如果被呼叫者需要分配緩衝區,建議使用以下方法:

void foo(char *str, int len) {
    // Write up to len characters into str
}
C 代碼

[DllImport("...", CallingConvention = CallingConvention.Cdecl)]
static extern void foo(StringBuilder str, int len);

// ...

StringBuilder sb = new StringBuilder(10);
foo(sb, sb.Capacity);
C#程式碼

作者採用互通友善的資料類型,我們可以有效克服C# 和C DLL 之間的字串交換障礙,為無縫通訊和無錯誤資料流鋪平道路。

以上是在 C# 和 C DLL 之間傳遞字串時如何解決 System.AccessViolationException?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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