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

Xen*_*ate 7 .net c# pinvoke calling-convention

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

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

那么__fastcall,无论你为CallingConvention属性设置什么,CLR都会继续使用x64约定来编组函数调用?

Han*_*ant 11

是的,完全被忽略了.64位pinvoke marshaller仅支持x64 ABI,松散地基于__fastcall.很松散.如果你指定CallingConvention,你就不会得到例外,它只是耸了耸肩.

请注意,__ vectorcall不是特定于x64,还有x86变体.pinvoke marshaller都不支持,你必须编写一个C++/CLI包装器.支持它的意义非常小,.NET抖动仍然具有非常弱的SSE2/AVX支持.System.Numerics.Vector中的一点点,带有RyuJIT抖动,VS2015附带的新x64抖动,但是还没有能够将参数传递给方法的地方.严格的对齐要求将需要非常激烈的CLR重写,远距离未来的音乐.