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

将Go代码编译为DLL供C# WinForms调用时遇BadImageFormatException

Go编译的DLL在C# WinForms中调用出现BadImageFormatException的解决办法

这个错误我之前也碰到过,核心原因百分百是CPU架构不匹配——你用Go编译出来的DLL和C# WinForms项目的目标平台(32位/64位)没对上,系统加载的时候就会报这个格式错误。下面一步步帮你排查解决:

1. 先确认两边的架构是否一致

检查Go的编译架构

打开命令行,执行:

go env GOARCH
  • 如果输出是amd64,说明Go默认编译的是64位二进制;如果是386,就是32位。

检查C#项目的目标平台

打开你的WinForms项目:

  • 右键项目 → 选择「属性」
  • 切换到「生成」标签页
  • 看「目标平台」选项:默认可能是Any CPU,这个选项有时候会自动切换架构,建议你明确指定和Go DLL一致的架构——比如Go编译的是64位就选x64,32位就选x86。

2. 重新编译匹配架构的Go DLL

如果两边架构不一致,就调整Go的编译环境重新生成DLL:

编译32位DLL

先设置Go的环境变量:

set GOARCH=386
set GOOS=windows

然后重新执行你的编译步骤:

go build -buildmode=c-archive
gcc -shared -pthread -o goDLL.dll goDLL.c exprt.a -lWinMM -lntdll -lWS2_32

编译64位DLL

确保Go环境变量是64位:

set GOARCH=amd64
set GOOS=windows

然后同样重新执行编译命令即可。

3. 最后收尾检查

  • 把新编译好的goDLL.dll替换掉WinForms项目Debug目录里的旧文件,别用错了版本;
  • 顺便检查你的tdm-gcc版本:如果编译64位DLL,要确保用的是64位的tdm-gcc工具链,别不小心用了32位的gcc来编译64位DLL,这也会导致格式问题。

另外提个小细节:你的Go代码里os.OpenFile那行末尾多了个分号,虽然不影响功能,但Go里一般不需要写这个,可以去掉更规范~

内容的提问来源于stack exchange,提问作者C4d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:23:09