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

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 Sub
    
    后续直接调用Hello()即可。

2. 修正Go编译细节

  • 确保编译命令完整,你之前的命令缺少build,正确命令为:
    go build -o mydll.dll -buildmode=c-shared
    
  • Go编译的c-shared DLL依赖Go运行时库,部署时需确保目标机器存在对应依赖;若要静态链接,需开启CGO并指定静态编译参数(例如针对GCC编译环境添加-static链接选项)。

3. 放弃mt.exe添加清单的尝试

mt.exe添加的是Win32应用清单,和.NET程序集清单完全无关,对你的问题没有帮助,无需继续尝试。

4. 先做最小化测试

先写一个极简VB测试程序(VB6或VB.NET),用上述方式调用你的DLL,确认能正常执行Hello函数后,再将DLL作为插件导入目标VB应用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:41:02