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