>如果呼叫約定不匹配,則使用p/instoke從C#呼叫C函數可能會導致崩潰。 本文探討了這些衝突背後的原因。
>呼叫慣例不符及其效果
>一個常見的方案涉及使用__stdcall
judend的C函數,而相應的c#DllImport
屬性指定CallingConvention.Cdecl
。發生這種情況是因為:
__stdcall
:callee
C程式碼中使用的__cdecl
。呼叫函數()負責堆疊清理。 caller
問題:堆疊不平衡>
>呼叫者和Callee在堆疊清理上不同意時,會導致堆疊不平衡。這導致崩潰,不可預測的行為以及由於堆疊資訊遺失而導致的不可靠調試。
其他呼叫約定(以及為什麼重要)
__thiscall
:__fastcall
:__clrcall
>__stdcall
為什麼預設的p/invoke judent會導致問題__cdecl
__fastcall
>
編譯的C程式碼發生衝突。這源自於與Windows API的歷史關聯,導致(不正確的)假設所有C函數都使用它。 此不匹配導致上述堆疊清理問題。
以上是為什麼使用`cdecl'的c#p/調用呼叫有時會在與'__STDCALL`C函數接口時崩潰?的詳細內容。更多資訊請關注PHP中文網其他相關文章!