首頁 > 後端開發 > C++ > 為什麼使用`cdecl'的c#p/調用呼叫有時會在與'__STDCALL`C函數接口時崩潰?

為什麼使用`cdecl'的c#p/調用呼叫有時會在與'__STDCALL`C函數接口時崩潰?

Barbara Streisand
發布: 2025-01-25 23:56:11
原創
660 人瀏覽過

Why Do C# P/Invoke Calls Using `Cdecl` Sometimes Crash When Interfacing with `__stdcall` C   Functions?

了解P/Indoke呼叫慣例衝突

>如果呼叫約定不匹配,則使用p/instoke從C#呼叫C函數可能會導致崩潰。 本文探討了這些衝突背後的原因。

>

呼叫慣例不符及其效果

>

一個常見的方案涉及使用__stdcall judend的C函數,而相應的c#DllImport屬性指定CallingConvention.Cdecl。發生這種情況是因為:

  • __stdcall Windows API和許多C函數的標準呼叫約定。呼叫函數()負責清理堆疊。 這是p/invoke預設值。 callee C程式碼中使用的
  • __cdecl。呼叫函數()負責堆疊清理。 caller
>

問題:堆疊不平衡>

>呼叫者和Callee在堆疊清理上不同意時,會導致堆疊不平衡。這導致崩潰,不可預測的行為以及由於堆疊資訊遺失而導致的不可靠調試。

其他呼叫約定(以及為什麼重要)

  • 在C中用於成員函數。 由於繼承和編譯器差異的複雜性,它在.NET P/INDOKE中不受直接支援。 > __thiscall
  • 使用CPU暫存器進行參數傳遞。 不支援託管程式碼。
  • __fastcall託管程式碼慣例,結合
  • >,
  • 的各個方面,與運行時安全檢查。 __clrcall >__stdcall為什麼預設的p/invoke judent會導致問題__cdecl__fastcall>
  • >預設的p/invoke呼叫常規(
)通常與使用

編譯的C程式碼發生衝突。這源自於與Windows API的歷史關聯,導致(不正確的)假設所有C函數都使用它。 此不匹配導致上述堆疊清理問題。

以上是為什麼使用`cdecl'的c#p/調用呼叫有時會在與'__STDCALL`C函數接口時崩潰?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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