在我的代码中,我可以从user32.dll加载“MessageBoxA”并使用它,但如果我尝试加载并使用我的DLL中的函数,我会崩溃。
我的C#代码:
[DllImport("SimpleDLL.dll")]
static extern int mymean(int a, int b, int c);
[DllImport("user32.dll")]
static extern int MessageBoxA(int hWnd,
string msg,
string caption,
int type);
[...]
这是有效的
MessageBoxA(0, "Hello, World!", "This is called from a C# app!", 0);
这次崩溃
int mean = mymean(12, 14, 16);
我的C ++ DLL代码: SimpleDLL.cpp:
extern "C" _declspec(dllexport) int mymean(int x, int y, int z)
{
return (x + y + z) / 3;
}
SimpleDLL.def:
LIBRARY "SimpleDLL"
mymean
SimpleDLL.dll被复制到与我从C#代码编译的.exe相同的文件夹。使用依赖性walker,我可以看到加载SimpleDLL.dll所需的所有DLL都存在。
答案 0 :(得分:6)
默认情况下,C#使用“stdcall”调用约定。你已经指定了“C”。您需要指定
[DllImport("SimpleDLL.dll",CallingConvention=CallingConvention.Cdecl)]
或将您的c代码更改为:
int _declspec(dllexport) stdcall mymean(int x, int y, int z)
答案 1 :(得分:0)
原来我的C#app是64位(默认是C#visual studio)而我的C ++ DLL是32位(默认是C ++ visual studio)。
感谢提示检查异常类型,这是一个badimageformatexception。
抱歉 - 总共C#newbie!