>故障排除C#P/Indoke調用慣例不匹配
>>本文使用平台調用(P/Invoke)在C#和C代碼之間進行交互時說明了一個常見的問題。 我們將重點介紹不匹配的通話慣例的問題:在C。 CallingConvention.Cdecl
中,__stdcall
呼叫約定解釋了
在32位環境中,呼叫慣例指示參數傳遞,堆棧存儲和清理。關鍵慣例包括:
__stdcall
使用
__cdecl
__fastcall
__thiscall
__cdecl
__clrcall
>代碼示例分析
及其c#p/indoke對應物:
<code class="language-c++">extern "C" int __stdcall InvokedFunction(int);</code>
<code class="language-csharp">[DllImport("CPlusPlus.dll", ExactSpelling = true, SetLastError = true, CallingConvention = CallingConvention.Cdecl)] private static extern int InvokedFunction(IntPtr intArg);</code>
。這導致堆棧失衡。 通常是p/invoke默認值(由於其Windows API的流行率),而與c代碼進行連接需要明確的慣例規範。
分辨率CallingConvention.Cdecl
__stdcall
__stdcall
解決方案很簡單:對齊C#調用約定與C One:__cdecl
鑰匙要點
理解呼叫慣例對於成功的跨語言互操作性至關重要。 匹配約定會阻止堆棧錯誤並確保平滑的C#和C集成。以上是為什麼我的 C# P/Invoke 使用 `CallingConvention.Cdecl` 呼叫 C `__stdcall` 函數時失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!