我正在处理一个相当庞大的代码库,其中C++功能从C#中进行P/Invoke调用。
在我们的代码库中有许多这样的调用...
C++:
extern "C" int __stdcall InvokedFunction(int);
使用对应的 C# 代码:
[DllImport("CPlusPlus.dll", ExactSpelling = true, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
private static extern int InvokedFunction(IntPtr intArg);
我已经尽我所能地搜寻了互联网,想知道为什么会出现这种明显的不匹配现象。例如,为什么C#中有Cdecl,而C++中有__stdcall?据说,这将导致堆栈被清除两次,但在两种情况下,变量都按相同的反向顺序推送到堆栈上,因此我没有看到任何错误,尽管在调试过程中尝试跟踪时可能会清除返回信息。
来自MSDN:http://msdn.microsoft.com/en-us/library/2x8kf7zx%28v=vs.100%29.aspx
// explicit DLLImport needed here to use P/Invoke marshalling
[DllImport("msvcrt.dll", EntryPoint = "printf", CallingConvention = CallingConvention::Cdecl, CharSet = CharSet::Ansi)]
// Implicit DLLImport specifying calling convention
extern "C" int __stdcall MessageBeep(int);
这里的 C++ 代码中有 extern "C"
,而 C# 中有 CallingConvention.Cdecl
。为什么不使用 CallingConvention.Stdcall
呢?又或者为什么 C++ 中还要用到 __stdcall
?
提前感谢!
__fastcall
,但实际上这是 MS 调用约定的一部分。通用地,它可以被视为快速调用约定家族的一部分。MS 快速调用、Borland 快速调用等等。MS 版本__fastcall
仅使用两个 x86 寄存器:ECX、EDX。而 Borland 版本则使用三个寄存器,现在在 Delphi 世界中以register
约定形式存在。请注意,我已经将原文改成了简化易懂的表达方式,但没有改变原意。 - David Heffernan__vectorcall
到底有何意义?我目前正在一个使用向量内在函数的项目中,我们只是通过(const)引用来传递向量...除了MSDN之外,还有其他关于此的文档吗?(例如,它尚未出现在 Agner Fog 的优秀指南中...) - MFH