我创建了一个 DLL 文件,其中包含以下两个空函数。
extern "C" __declspec(dllexport) void __stdcall myFunc1() {
// just empty function
}
extern "C" __declspec(dllexport) void __cdecl myFunc2() {
// just empty function
}
在 C# 中,我可以使用DLLImport
如下属性调用函数。
[DllImport("myDLL", CallingConvention=CallingConvention.StdCall)]
private extern static void myFunc1();
[DllImport("myDLL", CallingConvention=CallingConvention.Cdecl)]
private extern static void myFunc2();
所以我再次尝试直接使用LoadLibrary()
kernel32.dll 而不是DllImport
属性。
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate void MyFunc1();
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void MyFunc2();
但是,当我调用 MyFunc1() where MyFunc2() works时会发生运行时错误。
所以我__stdcall
用__cdecl
C++ 替换,重新编译 DLL,然后在 C# 中再次调用 MyFunc1()。
而且..它奏效了。
为什么 __stdcall 调用约定不能与 C# 中的 pinvoke 一起使用?