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重写,远距离未来的音乐.
归档时间: |
|
查看次数: |
417 次 |
最近记录: |