2016-01-16 18 views
5

P/Invokeを使用して明示的に64ビットの.NETアプリケーションを使用して64ビットのネイティブライブラリと対話する場合、DllImport属性のCallingConventionプロパティは実質的に無視されますか?64ビット.NETアプリケーションでCallingConventionは無視されますか?

"従来の" x86では、呼び出し元や呼び出し先がスタック変数をクリーンアップする方法(関数自体が特定のCPUレジスタなどを使用する方法も含む)を指定する必要があるため、これを尋ねます。私が理解する限り、x64には単一の慣習(__fastcall)しかありません(最近追加されたのは__vectorcallです)。

CallingConventionプロパティに設定した内容に関係なく、CLRはただちに進み、__fastcall x64規約で関数呼び出しをマーシャリングしますか?

答えて

9

はい、完全に無視されます。 64ビットのpinvoke marshallerは、__fastcallに基づいて緩やかにx64 ABIをサポートします。非常にゆるやか。 CallingConventionを指定すると、例外が発生することはありません。

__vectorcallはx64に固有のものではないことに注意してください。x86系もあります。どちらもpinvoke marshallerでサポートされていないので、C++/CLIラッパーを作成する必要があります。それがサポートされていることにはほとんど何の問題もなく、.NETジッタには依然として非常に弱いSSE2/AVXサポートがあります。 System.Numerics.VectorのRyuJITジッタ、VS2015に同梱されている新しいx64ジッタがありますが、まだメソッドに引数を渡すことができない場所はありません。厳しいアライメント要件は、非常に劇的なCLRリライト、長距離の将来の音楽を必要とするでしょう。

関連する問題