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