如何使VB.NET生成的DLL能够被VB6程序正常调用?
错误根因
运行时错误453为「DLL入口点找不到」,触发原因有两个:
- 调用方式错误:你用调用原生Win32 DLL的
Declare语法调用基于COM互操作暴露的.NET DLL,二者完全不兼容 - 目标机未完成COM注册和环境配置:仅在开发机注册DLL无效,Windows XP目标机需要单独完成环境部署和组件注册
解决步骤
第一步:调整.NET DLL编译配置(开发机操作)
- 打开VS2017的项目属性页,切换到「应用」选项卡,将目标框架修改为
.NET Framework 4.0,这是Windows XP支持的最高.NET Framework版本,更高版本无法在XP运行 - 切换到「生成」选项卡,平台目标选择
x86(VB6为32位运行时,必须匹配32位DLL),同时勾选「注册COM互操作」选项 - 重新编译生成DLL,替换之前复制到XP的旧版本文件
第二步:在Windows XP目标机注册COM组件
- 先在XP上安装
.NET Framework 4.0运行时,未安装的话COM组件无法加载 - 将DLL复制到VB6代码中对应的固定路径
C:\Temp\VB_Applications\My_DLL_Test\ - 以管理员身份打开命令提示符,执行注册命令:
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regasm.exe /codebase C:\Temp\VB_Applications\My_DLL_Test\MyNewDLL.dll
- 提示注册成功即可
第三步:修正VB6调用代码
删除你之前写的Private Declare Function MoveX Lib ...这行错误声明,改用COM对象调用方式,推荐用前期绑定(有代码提示、性能更好):
- 打开VB6工程,点击菜单「工程」→「引用」,在列表中找到你编译的.NET COM组件(名称和.NET项目的程序集名称一致),勾选后确认
- 替换全部调用代码为:
Private Declare Function GSCloseServer Lib "GSWDLL32.DLL" () As Long ' 声明COM对象实例 Dim myComObj As New MyNewDLL.ComClass1 Private Sub btnMove_Click() Call test End Sub Private Sub btnStop_Click() Dim Running As Integer Set Form1 = Nothing Running = GSCloseServer() If Running = 0 Then MsgBox "Close Server OK: " & Running, vbOKOnly Else MsgBox "Close Server Error " & Running, vbOKOnly End If ' 释放COM对象资源 Set myComObj = Nothing Unload Me End Sub Private Sub test() txtbxReadBack.Text = myComObj.MoveX() ' 如需读取Xposition属性可直接调用:txtbxReadBack.Text = myComObj.Xposition End Sub
如果不想添加引用,也可以用后期绑定方式,只需要修改对象创建逻辑即可:
Private Declare Function GSCloseServer Lib "GSWDLL32.DLL" () As Long Dim myComObj As Object Private Sub Form_Load() ' ProgID格式为「.NET程序集名称.类名」,和你.NET项目配置保持一致即可 Set myComObj = CreateObject("MyNewDLL.ComClass1") End Sub ' 其余按钮点击、test方法代码和前期绑定完全一致
注意事项
- 如果注册时提示regasm不存在,检查.NET Framework 4.0是否正确安装,32位XP的regasm路径固定在
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\下 - 不要混用
Declare语法调用COM DLL,你编写的.NET类的方法是通过COM接口暴露,没有作为原生DLL导出函数,因此Declare永远找不到入口点
内容的提问来源于stack exchange,提问作者RelicCoder
相关产品推荐
相关产品推荐

