You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)"。

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++
      

4. 验证DLL导出函数

用工具确认DLL是否正确导出目标函数:

  • 打开命令提示符,进入DLL所在目录,执行:
    dumpbin /exports funcs.dll
    
  • 查看输出中是否存在addInt32和subInt32,如果函数名带前缀(如_addInt32@8),说明extern "C"未生效,但你的代码已包含该声明,大概率还是架构问题导致的编译异常。

内容的提问来源于stack exchange,提问作者João Pedro Voga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:53:12