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

标签 c# .net pinvoke calling-convention

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

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

那么 CLR 是否只是继续使用 __fastcall x64 约定编码函数调用,而不管您为 CallingConvention 属性设置了什么?

最佳答案

是的,完全忽略了。 64 位 pinvoke 编码器仅支持 x64 ABI ,松散地基于 __fastcall。很松散。如果您指定 CallingConvention,您将不会得到异常,它只是耸耸肩。

请注意,__vectorcall 并非特定于 x64,还有一个 x86 变体。 pinvoke 编码器都不支持,您必须编写 C++/CLI 包装器。支持它没有什么意义,.NET 抖动仍然具有非常弱的 SSE2/AVX 支持。 System.Numerics.Vector 中的一点点 RyuJIT 抖动,VS2015 附带的新 x64 抖动,但还不能将参数传递给方法。苛刻的对齐要求将需要非常激烈的 CLR 重写,远距离 future 音乐。

关于c# - 64 位 .NET 应用程序中是否忽略了 CallingConvention?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34832679/

相关文章:

c# - ActivityIndi​​cator 未在绑定(bind)到 ViewModel 的 XAML 中显示

c# - 没有 SafeHandle 的 DllImport 会导致 MissingMethodException

c# - WindowsIdentity 构造函数使用 LogonUser 的 token 引发异常

c# - 从 .NET 动态解析 C stdlib 函数

c# - 如何在第一次单击 Xamarin.Form 时取消屏蔽用户控件内的输入密码

c# - C# 中的 NFA/DFA 实现

c# - WPF - 尝试在任务中打开一个新窗口但收到 "The calling thread must be STA exception"

.net - 子 AppDomain 中的 LINQ

.net - Server.MapPath()

c# - 这个语法在c#中是什么意思?