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

如何使VB.NET生成的DLL能够被VB6程序正常调用?

错误根因

运行时错误453为「DLL入口点找不到」,触发原因有两个:

  1. 调用方式错误:你用调用原生Win32 DLL的Declare语法调用基于COM互操作暴露的.NET DLL,二者完全不兼容
  2. 目标机未完成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对象调用方式,推荐用前期绑定(有代码提示、性能更好):

  1. 打开VB6工程,点击菜单「工程」→「引用」,在列表中找到你编译的.NET COM组件(名称和.NET项目的程序集名称一致),勾选后确认
  2. 替换全部调用代码为:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:06:03