ホームページ > バックエンド開発 > C++ > なぜ__stdcall CおよびCDECL C#がP/Invokeで競合を呼び出すのか、そしてこれをどのように解決できるのでしょうか?

なぜ__stdcall CおよびCDECL C#がP/Invokeで競合を呼び出すのか、そしてこれをどのように解決できるのでしょうか?

Barbara Streisand
リリース: 2025-01-25 23:46:11
オリジナル
227 人が閲覧しました

Why Do __stdcall C   and Cdecl C# Calls Conflict in P/Invoke, and How Can This Be Resolved?

cdecl/__ stdcallの競合をp/invoke

の理解を理解してください

p/invoke、c#and cは、適切な引数の合格とスタック管理を確保するために、コールコンベンションの一致に依存しています。 デフォルト(多くの場合__stdcall)P/Invoke Conventionを使用して、cdeclコンベンションを使用したC関数がC#から呼び出される場合に一般的な問題が発生します。

問題のルート

異なる呼び出しコンベンションは、スタックのクリーンアップを異なる方法で処理します:

  • :Windows APIとcomで広く使用されているCallee(C関数)は、スタックのクリーンアップを担当します。 __stdcall
  • :発信者(C#コード)がスタックのクリーンアップを処理するデフォルトのC呼び出し条約。
  • __cdecl:Cメンバー関数に使用。その複雑さのためにP/Invokeで直接サポートされていません。
  • __thiscallミスマッチの結果

cコードにを追加し、c#属性で

を指​​定するだけで問題は修正されません。 クリーンアップの責任が異なるため、腐敗を積み重ねることができ、即時のデバッガー警告がなくても、クラッシュや微妙な非難のエラーを引き起こす可能性があります。 スタックは2回掃除され、予測不可能な動作につながる可能性があります。

extern "C"解決策:一貫した規則CallingConvention.Cdeclキーは一貫性です。 c関数宣言を変更して、DllImport

に置き換えます。 次に、c#属性の一致を確認します

キーテイクアウト__cdeclextern "C" int __stdcall InvokedFunction(int); extern "C" int __cdecl InvokedFunction(int);信頼できるP/Inved Interoperabilityには、慣習を呼び出すことに注意することが不可欠です。 CとC#の間の一貫した慣習を使用すると、スタックの不均衡がなくなり、コードの全体的な堅牢性が向上します。

以上がなぜ__stdcall CおよびCDECL C#がP/Invokeで競合を呼び出すのか、そしてこれをどのように解決できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート