我正在开发一个相当大的代码库,其中 C++ 功能是从 C# P/Invoked。
我们的代码库中有很多调用,例如...
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);
再一次,extern "C"
在 C++ 代码和CallingConvention.Cdecl
C# 中都有。为什么不是CallingConvention.Stdcall
?或者,此外,为什么__stdcall
在 C++ 中有?
提前致谢!