4

我创建了一个 C# COM 可访问的 dll,我想在 VB6 中使用它我能够在 VB6 中使用我的 COM 对象,并硬引用 TLB。我现在要做的是删除这个引用并动态加载它我正在创建它,如下所示:

Dim keylok As Object
Set keylok = CreateObject("MyClassLib.MyObject")

一旦我点击第二行,我就会收到运行时错误 424“需要对象”。但是当我按如下方式创建它时:

Dim keylok As MyObject
Set keylok = CreateObject("MyClassLib.MyObject")

它工作正常。我不确定为什么会有所作为。无论如何,我不能使用第二个,因为我仍然需要物理参考。

我也尝试作为一种调试来写入我的 COM 对象构造函数中的文件,以判断它是否真的被调用。是的,它确实如此,我什至能够在构造函数中成功地调用我的 COM 对象中的其他方法。

我什至可以使用以下方法从另一个 C# 应用程序动态加载并使用它:

dynamic myObj = Activator.CreateInstance(Type.GetTypeFromProgID("MyClassLib.MyObject"));

有没有人遇到过类似的事情?

4

2 回答 2

1

我在@rskar 输入的帮助下找到了解决方案。所以,我想我会回答我的问题,以防万一有人遇到同样的问题。

我的对象没有影响 IDsipatch。所以我所要做的就是用它来装饰我的 C# COM 接口,InterfaceType(ComInterfaceType.InterfaceIsDual)所以它同时实现了 IUnknown 和 IDispatch。最初它装饰着InterfaceType(ComInterfaceType.InterfaceIsIUnknown)

于 2012-04-19T19:54:23.650 回答
0

我认为无论如何您都将需要 .tlb 。COM 对象需要能够被编组,因为 .Net 宿主在与 VB6 运行时不同的线程上运行。默认编组使用来自类型库的信息来执行此操作。IDIspatch 有 4 种方法,其中 2 种与访问类型信息有关。因此,如果您删除了 .tlb,那么当您创建 IDispatch COM 时,可能会尝试从中调用 ITypeInfo,但无法加载已注册的类型库。如果您消除 .tlb,您将无法进行编组,并且可能必须为您的界面提供自定义编组器。

于 2012-04-19T16:13:43.220 回答