理解C#P/Invoke呼叫慣例衝突:cdecl vs. stdcall
>平台Indoke(P/Invoke)託管(C#)和未管理(例如C)代碼的橋樑。 但是,調用約定的差異可能會導致互操作性問題。
>問題的來源
衝突源於C#中的C和默認P/Invoke設置之間的呼叫約定處理。
__stdcall
>
callee
>CallingConvention.Winapi
在
__stdcall
核心差異在於:會議關鍵字:
在c versus__stdcall
堆棧管理:CallingConvention.Winapi
(經常在C中使用)需要調用函數(CallingConvention.Stdcall
)才能清潔堆棧; __cdecl
雖然在此特定上下文中較不常見的錯誤來源,但參數順序在約定之間可能會有所不同。 caller
__stdcall
callee
正確的c#聲明:> 為了確保兼容性,c#
屬性必須與C函數的約定匹配:
CallingConvention.Cdecl
__stdcall
>始終確認非託管函數的呼叫約定,並在您的c#
聲明中精確地鏡像。 請諮詢微軟的文檔,以獲取有關受支持的通話慣例的詳細信息。>
以上是為什麼 Cdecl 和 Stdcall 呼叫約定在 C# P/Invoke 中不匹配,如何解決此問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!