Windows 64位环境下C#调用C++ DLL程序崩溃问题求助
解决C#调用MinGW编译的C++ DLL崩溃问题
你的程序在其他电脑正常但本地崩溃,大概率是以下几个原因之一,按顺序排查:
1. 架构不匹配(最常见)
Windows 64位系统下,如果用32位MinGW编译出32位DLL,而C#项目默认以64位进程运行,跨架构调用会直接导致进程崩溃。
- 解决:
- 换成64位MinGW-w64编译DLL,原编译命令不变;
- 或修改C#项目属性,将「平台目标」设为
x86,强制以32位进程运行,再重新编译。
2. DLL运行时路径错误
代码里的DllPath是相对路径,dotnet run的工作目录是项目根,但.NET实际会在输出目录(如cs\bin\Debug\netX.x)加载DLL,找不到文件时会直接崩溃(非托管DLL加载失败不会抛出.NET异常)。
- 解决:
- 编译DLL后,手动把
cpp\funcs.dll复制到C#项目的输出目录; - 或修改
DllPath为DLL的绝对路径; - 或在C#项目的「生成后事件命令行」添加自动复制命令:
copy "$(SolutionDir)cpp\funcs.dll" "$(TargetDir)"。
- 编译DLL后,手动把
3. MinGW运行时库缺失
MinGW编译的DLL依赖自身的运行库(如libgcc_s_seh-1.dll、libstdc++-6.dll),若本地机器未安装MinGW或这些库不在系统PATH中,会导致DLL加载失败崩溃。
- 解决:
- 将MinGW安装目录下的
bin文件夹添加到系统PATH环境变量; - 或编译时用静态链接打包依赖库,修改编译命令为:
g++ cpp\funcs.cpp -o cpp\funcs.dll -shared -static-libgcc -static-libstdc++
- 将MinGW安装目录下的
4. 验证DLL导出函数
用工具确认DLL是否正确导出目标函数:
- 打开命令提示符,进入DLL所在目录,执行:
dumpbin /exports funcs.dll - 查看输出中是否存在
addInt32和subInt32,如果函数名带前缀(如_addInt32@8),说明extern "C"未生效,但你的代码已包含该声明,大概率还是架构问题导致的编译异常。
内容的提问来源于stack exchange,提问作者João Pedro Voga
相关产品推荐
相关产品推荐

