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