Windows下GoLang DLL在VB应用中加载失败的解决方法
问题
我在Windows 11系统上使用一款支持以DLL作为插件导入的现有VB应用,插件DLL的开发语言不受限制。我想用GoLang编写插件,于是写了一个极简DLL测试:
package main import "C" import "fmt" //export Hello func Hello() { fmt.Println("Hello from DLL!") } func main() {}
编译命令:
go build -o mydll.dll -buildmode=c-shared
加载插件时出现错误:
.NET DLL Exception: Could not load file or assembly 'file:///C:\testing\mydll.dll' or one of its dependencies. The module was expected to contain an assembly manifest. UM DLL Exception: ImageRvaToVa (NamesPointer) failed
我尝试用mt.exe添加清单,但没有效果,DLL的大小和修改时间都没变化:
> .\mt.exe -manifest "App.config" -outputresource:"mydll.dll" > .\mt.exe -inputresource:"mydll.dll" -out:"my.extracted.manifest"
请问怎么让这个GoLang编写的DLL被VB应用正常加载?
解决方案
问题核心是你的VB应用误将Go编译的原生Win32 DLL当成了.NET程序集加载,而Go用-buildmode=c-shared生成的DLL是标准C风格原生动态库,不含.NET程序集要求的清单结构,因此报错。
1. 针对VB应用类型调整加载方式
- 如果是VB6原生程序:
不要用程序集加载逻辑,改用原生Win32调用方式。在VB6代码中声明导出函数:
之后直接调用Declare Sub Hello Lib "mydll.dll" ()Hello()即可。 - 如果是VB.NET程序:
通过P/Invoke机制调用原生DLL,而非把它当作.NET程序集加载。在VB.NET代码中声明:
后续直接调用<DllImport("mydll.dll")> Public Shared Sub Hello() End SubHello()即可。
2. 修正Go编译细节
- 确保编译命令完整,你之前的命令缺少
build,正确命令为:go build -o mydll.dll -buildmode=c-shared - Go编译的
c-sharedDLL依赖Go运行时库,部署时需确保目标机器存在对应依赖;若要静态链接,需开启CGO并指定静态编译参数(例如针对GCC编译环境添加-static链接选项)。
3. 放弃mt.exe添加清单的尝试
mt.exe添加的是Win32应用清单,和.NET程序集清单完全无关,对你的问题没有帮助,无需继续尝试。
4. 先做最小化测试
先写一个极简VB测试程序(VB6或VB.NET),用上述方式调用你的DLL,确认能正常执行Hello函数后,再将DLL作为插件导入目标VB应用。
内容的提问来源于stack exchange,提问作者philbot999
相关产品推荐
相关产品推荐

