在64位.NET应用程序中是否忽略了CallingConvention?

时间:2016-01-16 22:07:33

标签: c# .net pinvoke calling-convention

当通过P / Invoke通过显式64位.NET应用程序与64位本机库进行交互时,DllImport属性中的CallingConvention属性是否被有效忽略?

我问这个是因为在“传统”x86上你必须指定调用者或被调用者清理堆栈变量的方式(以及函数本身如何使用某些CPU寄存器等);但据我了解,x64只有一个约定__fastcall(尽管最近添加了__vectorcall)。

因此,无论您为__fastcall属性设置了什么,CLR都会继续使用CallingConvention x64约定封送函数调用?

1 个答案:

答案 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重写,远距离未来的音乐。