64 位 .NET 应用程序中是否忽略了 CallingConvention?
Is the CallingConvention ignored in 64-bit .NET applications?
当通过显式 64 位 .NET 应用程序通过 P/Invoke 与 64 位本机库交互时,DllImport
属性中的 CallingConvention 属性有效忽略?
我问这个是因为在 "traditional" x86 上你必须指定调用者或被调用者清理堆栈变量的方式(以及函数本身如何使用某些 CPU 寄存器等);但据我了解,x64 只有一个约定,__fastcall
(尽管最近添加了 __vectorcall
)。
那么 CLR 是否会继续使用 __fastcall
x64 约定编组函数调用,而不管您为 CallingConvention
属性 设置了什么?
是的,完全忽略了。 64 位 pinvoke 编组器仅支持 x64 ABI,松散地基于 __fastcall。很松散。如果您指定 CallingConvention,您将不会得到异常,它只是耸耸肩。
请注意,__vectorcall 并非特定于 x64,还有一个 x86 变体。 pinvoke 编组器都不支持,您必须编写 C++/CLI 包装器。支持它没有什么意义,.NET 抖动仍然有非常弱的 SSE2/AVX 支持。 System.Numerics.Vector 中的一点点 RyuJIT 抖动,VS2015 附带的新 x64 抖动,但还不能将参数传递给方法。苛刻的对齐要求将需要非常激烈的 CLR 重写,远距离未来音乐。
当通过显式 64 位 .NET 应用程序通过 P/Invoke 与 64 位本机库交互时,DllImport
属性中的 CallingConvention 属性有效忽略?
我问这个是因为在 "traditional" x86 上你必须指定调用者或被调用者清理堆栈变量的方式(以及函数本身如何使用某些 CPU 寄存器等);但据我了解,x64 只有一个约定,__fastcall
(尽管最近添加了 __vectorcall
)。
那么 CLR 是否会继续使用 __fastcall
x64 约定编组函数调用,而不管您为 CallingConvention
属性 设置了什么?
是的,完全忽略了。 64 位 pinvoke 编组器仅支持 x64 ABI,松散地基于 __fastcall。很松散。如果您指定 CallingConvention,您将不会得到异常,它只是耸耸肩。
请注意,__vectorcall 并非特定于 x64,还有一个 x86 变体。 pinvoke 编组器都不支持,您必须编写 C++/CLI 包装器。支持它没有什么意义,.NET 抖动仍然有非常弱的 SSE2/AVX 支持。 System.Numerics.Vector 中的一点点 RyuJIT 抖动,VS2015 附带的新 x64 抖动,但还不能将参数传递给方法。苛刻的对齐要求将需要非常激烈的 CLR 重写,远距离未来音乐。