从VB 6代码调用托管DLL的问题

时间:2011-08-22 08:32:51

标签: .net com vb6 com-interop vb6-migration

我已使用Visual Studio 2008转换向导将VB6代码移植到VB.Net。移植的代码编译正确。

我检查了编译器选项,以便在项目属性上注册COM interop。在构建项目时,我得到了DLL和TLB文件。

我已使用以下命令

注册了程序集
regasm myLib.DLL /tlb:myLib.tlb

之后我使用

对装配进行了GAC
gacutil /i myLib.DLL

现在,正在使用DLL的VB代码......

 Dim myObject
    Set myObject= CreateObject("myLib.MyObject")

..抛出错误 -

  

运行时错误429,ActiveX组件无法创建对象。

我需要做什么才能使其正常工作?

2 个答案:

答案 0 :(得分:1)

要检查的一件事在过去引起了我的注意: -

如果.NET端的构造函数抛出错误(无论是否处理)并且您使用CreateObject在VB6中创建对象,则会收到Runtime Error 429, ActiveX componenet cant create object.

在开发过程中,最好添加对托管项目的引用并使用:

Dim myObject
Set myObject = New myLib.MyObject

这样你至少可以看到管理方面已经抛出错误。

答案 1 :(得分:1)

  1. 从基础知识开始,您是否将希望公开的对象设置为VB6为ComVisible?如果我没记错的话,Visual Studio 2008默认在程序集级别具有ComVisible(false),而在早期的Visual Studio版本中它默认为True。
  2. 编辑#1:

    1. 您使用的是深层嵌套的命名空间还是复杂的程序集名称?我发现使用mycompany.myproduct.subcomponent样式命名约定程序集和命名空间名称混淆类型导出器。它使用命名空间来创建VB6中所需的编程ID的左侧。

    2. 运行RegAsm时会输出什么消息?如果找不到任何类型的注册,通常会告诉你。

    3. 检查TypeLib并查看您希望看到的类型是否在那里。您可以直接从VB6引用tlb并点击F2查看TypeLib。您可以使用Visual Studio 6附带的OLE视图。

    4. 在注册组件时是否尝试使用/ codebase选项以查看其行为是否有所不同?我几乎总是使用代码库注册,因为这类似于常规COM注册的工作方式。