【问题标题】:Problem with calling a managed DLL from VB 6 code从 VB 6 代码调用托管 DLL 的问题
【发布时间】:2011-10-31 23:17:46
【问题描述】:

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

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

我已经使用以下命令注册了程序集

regasm myLib.DLL /tlb:myLib.tlb

之后,我使用

对程序集进行了 GAC
gacutil /i myLib.DLL

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

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

..引发错误 -

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    Dim myObject
    Set myObject = New myLib.MyObject
    

    这样你至少可以看到托管端抛出了一个错误。

    【讨论】:

    • 创建了一个虚拟 probject 来测试这个和那个工作。我发现使用 procmon 的一个区别是,对于虚拟项目,运行时会在 HKCR\MyDummyLib.MyObject 下找到一个条目。但是我的图书馆找不到它。有什么想法吗?
    【解决方案2】:
    1. 从基础开始,您是否将希望向 VB6 公开的对象设置为 ComVisible?如果我没记错的话,Visual Studio 2008 默认在程序集级别具有 ComVisible(false),而在早期的 Visual Studio 版本中,它曾经默认为 True。

    编辑#1:

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

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

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

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

    【讨论】:

    • ComVisible 在程序集级别为真。
    • 我不知道为什么它让我重新开始编号为 1,但我添加了一些后续建议。
    猜你喜欢
    • 2010-11-02
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2011-06-13
    • 2011-10-28
    • 1970-01-01
    相关资源
    最近更新 更多