我已使用Visual Studio 2008转换向导将VB6代码移植到VB.Net。移植的代码编译正确。
我检查了编译器选项,以便在项目属性上注册COM interop。在构建项目时,我得到了DLL和TLB文件。
我已使用以下命令
注册了程序集regasm myLib.DLL /tlb:myLib.tlb
之后我使用
对装配进行了GACgacutil /i myLib.DLL
现在,正在使用DLL的VB代码......
Dim myObject
Set myObject= CreateObject("myLib.MyObject")
..抛出错误 -
运行时错误429,ActiveX组件无法创建对象。
我需要做什么才能使其正常工作?
答案 0 :(得分:1)
要检查的一件事在过去引起了我的注意: -
如果.NET端的构造函数抛出错误(无论是否处理)并且您使用CreateObject
在VB6中创建对象,则会收到Runtime Error 429, ActiveX componenet cant create object.
在开发过程中,最好添加对托管项目的引用并使用:
Dim myObject
Set myObject = New myLib.MyObject
这样你至少可以看到管理方面已经抛出错误。
答案 1 :(得分:1)
编辑#1:
您使用的是深层嵌套的命名空间还是复杂的程序集名称?我发现使用mycompany.myproduct.subcomponent样式命名约定程序集和命名空间名称混淆类型导出器。它使用命名空间来创建VB6中所需的编程ID的左侧。
运行RegAsm时会输出什么消息?如果找不到任何类型的注册,通常会告诉你。
检查TypeLib并查看您希望看到的类型是否在那里。您可以直接从VB6引用tlb并点击F2查看TypeLib。您可以使用Visual Studio 6附带的OLE视图。
在注册组件时是否尝试使用/ codebase选项以查看其行为是否有所不同?我几乎总是使用代码库注册,因为这类似于常规COM注册的工作方式。