当通过 P/Invoke 通过显式 64 位 .NET 应用程序与 64 位本机库交互时,调用约定 https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention%28v=vs.110%29.aspx财产在DllImport
属性被有效忽略?
我问这个问题是因为在“传统”x86 上,您必须指定调用者或被调用者清理堆栈变量的方式(以及函数本身如何使用某些 CPU 寄存器等);但据我了解,x64 只有一个约定,__fastcall
(最近添加的__vectorcall
虽然)。
那么 CLR 是否会继续使用以下命令来封送函数调用:__fastcall
x64 约定,无论您设置什么CallingConvention
财产?
是的,完全被忽视了。 64 位 pinvoke 编组器仅支持x64 ABI https://msdn.microsoft.com/en-us/library/ms235286.aspx,松散地基于 __fastcall。非常宽松。如果您指定 CallingConvention,您不会遇到异常,它只是耸耸肩。
请注意,__vectorcall 并非特定于 x64,还有 x86 变体。 pinvoke 编组器均不支持,您必须编写 C++/CLI 包装器。支持它没有什么意义,.NET 抖动的 SSE2/AVX 支持仍然很弱。 System.Numerics.Vector 中存在一点点 RyuJIT 抖动,这是 VS2015 附带的新 x64 抖动,但目前还无法将参数传递给方法。严格的对齐要求将需要非常彻底的 CLR 重写,远距离的未来音乐。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)