使用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组件:
- 修改.NET项目设置:
- 打开AIEncryptor的.NET项目,右键→属性→应用程序→程序集信息,勾选"使程序集COM可见"。
- 给
AIEncryptor类加上[ComVisible(true)]特性,还要确保类有无参数的构造函数(COM组件必须的)。 - 右键→属性→生成,勾选"为COM互操作注册"(调试时自动注册,发布后用regasm)。
- 用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了。
- 打开管理员命令提示符,切换到对应版本的regasm目录:
最后提醒
VB6是32位程序,你的.NET DLL一定要编译成x86平台(右键项目→属性→生成→目标平台选x86),否则会出现兼容性问题。
内容的提问来源于stack exchange,提问作者Abdul Manaf
相关产品推荐
相关产品推荐

