当通过 P/Invoke 通过显式 64 位 .NET 应用程序与 64 位 native 库交互时,是 CallingConvention DllImport
属性中的属性有效地被忽略了吗?
我问这个是因为在“传统的”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 重写,远距离 future 音乐。
关于c# - 64 位 .NET 应用程序中是否忽略了 CallingConvention?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34832679/