C#:加载C ++ DLL的问题

时间:2009-11-10 20:06:30

标签: c# c++ dll pinvoke

在我的代码中,我可以从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都存在。

2 个答案:

答案 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!