首頁 > 後端開發 > C++ > 為什麼我的 C# P/Invoke 使用 `CallingConvention.Cdecl` 呼叫 C `__stdcall` 函數時失敗?

為什麼我的 C# P/Invoke 使用 `CallingConvention.Cdecl` 呼叫 C `__stdcall` 函數時失敗?

Patricia Arquette
發布: 2025-01-25 23:51:11
原創
410 人瀏覽過

Why Does My C# P/Invoke Call With `CallingConvention.Cdecl` Fail When Calling a C   `__stdcall` Function?

>故障排除C#P/Indoke調用慣例不匹配

>

>本文使用平台調用(P/Invoke)在C#和C代碼之間進行交互時說明了一個常見的問題。 我們將重點介紹不匹配的通話慣例的問題:在C。 CallingConvention.Cdecl中,__stdcall

呼叫約定解釋了

在32位環境中,呼叫慣例指示參數傳遞,堆棧存儲和清理。關鍵慣例包括:

  • 呼叫者按參數; Callee清潔堆棧。 Windows Apis和com。 __stdcall使用
  • 呼叫者推動參數並清潔堆棧。 C.的標準 __cdecl
  • >使用寄存器進行某些參數,有可能提高速度但降低兼容性。 __fastcall
  • 類似於>,但是處理C成員函數中的“此”指針。 __thiscall __cdecl
  • 一個託管呼叫的慣例平衡他人的元素,防止堆棧問題。
  • __clrcall>代碼示例分析
考慮C函數:

及其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>
登入後複製
這個問題源於C#與c#衝突的

。這導致堆棧失衡。 通常是p/invoke默認值(由於其Windows API的流行率),而與c代碼進行連接需要明確的慣例規範。

分辨率CallingConvention.Cdecl__stdcall __stdcall解決方案很簡單:對齊C#調用約定與C One: __cdecl

鑰匙要點

理解呼叫慣例對於成功的跨語言互操作性至關重要。 匹配約定會阻止堆棧錯誤並確保平滑的C#和C集成。

以上是為什麼我的 C# P/Invoke 使用 `CallingConvention.Cdecl` 呼叫 C `__stdcall` 函數時失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板