cdecl/__ stdcallの競合をp/invoke
の理解を理解してくださいp/invoke、c#and cは、適切な引数の合格とスタック管理を確保するために、コールコンベンションの一致に依存しています。 デフォルト(多くの場合__stdcall
)P/Invoke Conventionを使用して、cdecl
コンベンションを使用したC関数がC#から呼び出される場合に一般的な問題が発生します。
問題のルート
異なる呼び出しコンベンションは、スタックのクリーンアップを異なる方法で処理します:
__stdcall
__cdecl
:Cメンバー関数に使用。その複雑さのためにP/Invokeで直接サポートされていません。
__thiscall
ミスマッチの結果cコードにを追加し、c#属性で
を指定するだけで問題は修正されません。 クリーンアップの責任が異なるため、腐敗を積み重ねることができ、即時のデバッガー警告がなくても、クラッシュや微妙な非難のエラーを引き起こす可能性があります。 スタックは2回掃除され、予測不可能な動作につながる可能性があります。extern "C"
解決策:一貫した規則CallingConvention.Cdeclキーは一貫性です。 c関数宣言を変更して、DllImport
:
に置き換えます。 次に、c#属性の一致を確認します
キーテイクアウト__cdecl
extern "C" int __stdcall InvokedFunction(int);
extern "C" int __cdecl InvokedFunction(int);
信頼できるP/Inved Interoperabilityには、慣習を呼び出すことに注意することが不可欠です。 CとC#の間の一貫した慣習を使用すると、スタックの不均衡がなくなり、コードの全体的な堅牢性が向上します。
以上がなぜ__stdcall CおよびCDECL C#がP/Invokeで競合を呼び出すのか、そしてこれをどのように解決できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。