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

使用mscoree.CorRuntimeHost在VB6中托管.NET出现"Object Required"错误

解决VB6调用.NET类库AIEncryptor.dll的"Object Required"错误及注册问题

我来帮你梳理下这两个问题的原因和解决办法,结合你的代码一步步来:

一、"Object Required"错误的具体原因

看你的VB6代码,有几个明显的问题导致了这个错误:

  • 错误的类型声明:VB6没法直接识别.NET的AppDomain类型,你把domain声明成AppDomain是不对的,得改成Object类型。
  • CurrentDomain调用语法错了:CorRuntimeHost的CurrentDomain需要通过GetCurrentDomain方法来获取,而不是直接赋值,正确的写法是CORHost.GetCurrentDomain domain。
  • 潜在的空对象风险:如果前面的domain获取失败,Result就会是Nothing,后续给Result.InitVector赋值自然就会抛出"Object Required"。

二、为什么regasm.exe注册失败?

大概率是这几个原因之一:

  • COM可见性没开:你的.NET类库可能没设置COM可见,或者AIEncryptor类没加[ComVisible(true)]特性——regasm只能注册对外暴露COM接口的.NET组件。
  • regasm版本不匹配:VB6是32位程序,你得用对应.NET版本的32位regasm(比如.NET 4.x的话,路径是C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe),别用64位的。
  • 权限不够:注册COM组件需要管理员权限,右键命令提示符选"以管理员身份运行"再执行regasm。
  • DLL依赖缺失:AIEncryptor.dll可能依赖其他.NET组件,导致regasm加载失败,可以用工具(比如Dependency Walker)检查下依赖。

三、修正后的VB6代码

调整了错误点,还加了空值判断和资源清理,你可以试试:

Dim CORHost As New mscoree.CorRuntimeHost
Dim domain As Object ' 改用Object类型适配VB6
Dim AssemblyFilename As String
Dim Classname As String
Dim Result As Object
Dim objEnc As Object

AssemblyFilename = "D:\MyProject\AIEncryptor.dll"
Classname = "AcceleratedIdeas.AIEncryptor"

CORHost.Start
CORHost.GetCurrentDomain domain ' 正确获取AppDomain实例
Set Result = domain.CreateInstanceFrom(AssemblyFilename, Classname).Unwrap

' 先判断对象是否创建成功再操作
If Not Result Is Nothing Then
    Result.InitVector = "@1B2c3D4e5F6g7H8"
Else
    MsgBox "Failed to create .NET object instance!"
End If

' 记得关闭宿主释放资源
CORHost.Stop
Set CORHost = Nothing

四、正确注册DLL的步骤(如果想用COM直接调用)

如果不想用CorRuntimeHost动态加载,更简单的方式是注册成COM组件:

  1. 修改.NET项目设置:
    • 打开AIEncryptor的.NET项目,右键→属性→应用程序→程序集信息,勾选"使程序集COM可见"。
    • 给AIEncryptor类加上[ComVisible(true)]特性,还要确保类有无参数的构造函数(COM组件必须的)。
    • 右键→属性→生成,勾选"为COM互操作注册"(调试时自动注册,发布后用regasm)。
  2. 用regasm注册:
    • 打开管理员命令提示符,切换到对应版本的regasm目录:
      cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
      
    • 执行注册命令,同时生成类型库(方便VB6引用):
      regasm.exe "D:\MyProject\AIEncryptor.dll" /tlb:AIEncryptor.tlb /codebase
      
    • 注册成功后,在VB6里引用生成的AIEncryptor.tlb,就能直接声明Dim objEnc As New AIEncryptor,不用再绕CorRuntimeHost了。

最后提醒

VB6是32位程序,你的.NET DLL一定要编译成x86平台(右键项目→属性→生成→目标平台选x86),否则会出现兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:59:29