【问题标题】:VB6 .NET Interop Object Required需要 VB6 .NET 互操作对象
【发布时间】:2011-07-10 08:31:16
【问题描述】:

我知道我大约在 6 年前解决了同样的问题......但我不太记得诀窍是什么。

我有一个 .NET 类。它是 COM 可见的(但未注册 COM)。它作为调用 COM 注册类的结果返回。所以我的 VB6 代码以

结尾
Dim instance as Variant
' call .NET exposed tlb to set instance with a COM visible class
Dim wrapper as New ComWrapper  ' this is a .NET class COM exposed and registered
Set instance = wrapper.MyClassInstance ' MyClassInstance is an instance of COM visible, but not COM registered MyClass defined below
instance.DoIt 1

相关类是 MyClass

public class MyClass
{
    public void DoIt(int id) { ... }
}

调用 instance.DoIt 1 引发异常“需要对象”。如果我没记错的话,它与整数 1 需要被装箱或拆箱或其他东西有关,VB6 不会自动为你做......但我不记得如何修复它。 .. 如果 DoIt 方法没有参数,一切正常...

有人知道如何解决这个问题吗?

谢谢。

【问题讨论】:

    标签: .net vb6 interop com-interop


    【解决方案1】:

    这将是一个装箱短,VB6 整数是 16 位。此外,在 VB6 中传递的默认参数是 ByRef。将参数声明为 object 应该可以工作。它已经太久了,但我认为语法是错误的。应该是

    instance.DoIt 1
    

    Call instance.DoIt(1)
    

    注意括号。没有什么理由做这个后期绑定。只要您的类是 [ComVisible],那么它就会出现在类型库中,您只需声明 VB6 变量类型以允许编译器检查您的代码并生成最佳调用。不需要注册课程。

    Dim instance As MyClass
    

    【讨论】:

    • MyClass 在单独的 dll 中,我不想注册多个类型库进行通信。必须注册一个类型库就够麻烦了。
    • 你确实想注册一个类型库。在 VB6 中使用 Project + References,浏览添加 .tlb
    • 据我所知,这确实增加了通过 regasm 将 dll 注册为 tlb 的要求。第二个程序集是一个 .NET COM 可见的、非 regasm 的类库。
    • 不,它没有。唯一需要注册的是创建您希望 COM 为您创建的对象的类工厂。 ComWrapper 在您的情况下。为什么我的 cmets 与你的假设完全不同步?不知道。
    • 是的,只有创建您希望 COM 为您创建的对象的类工厂需要在 COM 注册表中注册。不,您不能添加对 .NET 类库的引用,除非它已导出到类型库(即使它不是在注册表中注册的 COM)。试试看。
    【解决方案2】:

    通过将instance 声明为Object 来尝试后期绑定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 2021-11-27
      • 2011-12-21
      • 2018-07-16
      • 2023-04-04
      相关资源
      最近更新 更多