C#:加载 C++ DLL 时出现问题

Posted

技术标签:

【中文标题】C#:加载 C++ DLL 时出现问题【英文标题】:C#: problem loading C++ DLL 【发布时间】:2009-11-10 20:06:30 【问题描述】:

在我的代码中,我可以从 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 相同的文件夹中。使用依赖遍历器,我可以看到加载 SimpleDLL.dll 所需的所有 DLL。

【问题讨论】:

您看到的异常是什么? 定义“崩溃”。正如您所说,您没有向任何人提供任何可以帮助我们解决您的问题的信息。 “崩溃”可能意味着一千件事中的任何一件,包括“我的电脑速度穿过房间并撞上电视”,这可能不太可能。缩小范围怎么样? 【参考方案1】:

C# 默认使用“stdcall”调用约定。您已指定“C”。您需要指定

[DllImport("SimpleDLL.dll",CallingConvention=CallingConvention.Cdecl)]

或将您的 c 代码更改为:

int _declspec(dllexport) stdcall mymean(int x, int y, int z)

【讨论】:

【参考方案2】:

原来我的 C# 应用程序是 64 位的(这是 C# Visual Studio 的默认设置),而我的 C++ DLL 是 32 位的(这是 C++ Visual Studio 的默认设置)。

感谢您提供检查异常类型的提示,这是一个错误的图像格式异常。

抱歉 - 完全是 C# 新手!

【讨论】:

以上是关于C#:加载 C++ DLL 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

将 c# 应用程序打开到另一台电脑时出现无法加载 ace.dll32 的错误

加载 32 位 DLL 时出现 BadImageFormatException,目标是 x86

从 C# 调用 C++ dll 函数时出现问题

使用 C# 访问非托管 C++ DLL 时出现 AccessViolationException

在 C# 中绑定 C++ dll 时出现 EntryPointNotFoundException

尝试从 C# 调用 C++ dll 时出现格式不正确的异常