「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C# `cdecl`呼び出しとc ++` __stdcall`署名がp/invokeで共存するのはなぜですか?

C# `cdecl`呼び出しとc ++` __stdcall`署名がp/invokeで共存するのはなぜですか?

2025-03-24に投稿されました
ブラウズ:296

Why Do C# `Cdecl` Calls and C   `__stdcall` Signatures Coexist in P/Invoke?

c# cdecl and c __ stdcall p/invoke

の共存の理由

P/Invoke C#とCの間の相互運用性を呼び出すと、C#関数が cdecl 呼び出しコンベンションを使用しますが、それに対応する関数は __ stdcall signatureを使用します。このミスマッチは、今日まで歴史的に継続されてきたコールコンベンションの選択に由来しています。

__ stdcall :Windows関数の発信者はクリーンアップ

をクリーンアップします

__ stdcall は、16ビットのPascal Calling Conventionから継承し、Windows API関数とcomのデフォルトの呼び出しコンベンションです。これは、Callee(呼び出されている関数)が実行後にスタックをクリーニングし、リソースに制約のある環境でよりコンパクトにすることを指定します。ただし、発信者とCalleeが予想するパラメーターの数が一致しない場合、この利点はスタックの不均衡のリスクをもたらします。

__ cdecl :可変パラメーター関数の掃除

]]

__ cdecl は、 printf() scanf()など、さまざまなパラメーターを持つ関数のcの標準通話慣習です。この条約は、発信者が合格したパラメーターの数を知っているため、発信者のスタッククリーニングの責任を負います。 callenconvention.cdecl [dllimport] を指定するのを忘れました。

__ thiscall :このc method

]のこのポインターを隠す

__ thiscall は、クラスのインスタンスメソッドで隠されたポインターを処理するcを具体的に指します。 __ cdecl に似ていますが、.NET P/Invoke Marshalling Handlerはそれをサポートせず、したがってPinvoke Cコードには適していません。

要約

cdecl

call in c#in c#and __ stdcall callの共存は、cの署名です。これらの慣習の適切な理解、および entrypoint およびプロパティのプロパティは、正しいP/呼び出し機能を確保し、スタックの不均衡などの潜在的な問題を回避するために重要です。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3