VB6:运行时错误424调用CreateObject时

时间:2012-04-18 16:07:01

标签: c# com vb6 runtime-error createobject

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

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

一旦我点击第二行,我得到运行时错误424“Object Required”。 但是当我按如下方式创建它时:

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

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

我还尝试将其作为一种调试来写入我的COM对象构造函数中的文件,如果它真的被调用的话。是的,我甚至可以在构造函数内成功调用COM对象中的其他方法。

我甚至能够动态加载并使用以下命令从另一个C#应用程序中使用:

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

之前有没有遇到类似的事情?

2 个答案:

答案 0 :(得分:1)

我在@rskar输入的帮助下找到了解决方案。所以,我想我会回答我的问题,以防任何人面临同样的问题。

我的对象没有妨碍IDsipatch。所以我必须用InterfaceType(ComInterfaceType.InterfaceIsDual)来装饰我的C#COM接口所以它实现了IUnknown和IDispatch。 最初它是用InterfaceType(ComInterfaceType.InterfaceIsIUnknown)

装饰的

答案 1 :(得分:0)

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