C#COM类 - DISP_E_UNKNOWNNAME

时间:2010-09-10 21:48:38

标签: c# .net-3.5 com vbscript

我在C#中声明了一个COM可见类。代码如下:

[ComVisible(true)]
public class AComVisibleClass : TheParentClass
{
    public bool SomeFunc(string id)
    {
        return true;
    }

}

此类由工厂类实例化,也可以访问COM。

但是如果我尝试访问VB脚本文件,则会抛出DISP_E_UNKNOWNNAME异常。

这是我们在这里工作的先前存在的库的新类。所有其他类都可以通过COM访问。整个库被编译成一个汇编文件。我已使用regasm注册了新程序集,但我仍然遇到此异常。

我尝试使用VS2008调试COM调用。工厂类似乎能够实例化AComVisibleClass。仅当工厂尝试执行SomeFunc时才会抛出上述异常。

我知道这听起来有点(?)有点模糊,但我不能在这里公开真实的代码。如果有人需要更多信息,请问我。

2 个答案:

答案 0 :(得分:4)

我可以想到这个问题的三个可能原因:

原因1:CreateObject中使用的名称错误:

我想你的VBScript代码调用了  就像是  这样:

 Set obj = CreateObject("MyLibrary.AComVisibleClass")

如果这是正确的,请打开注册表编辑器并检查HKEY_CLASSES_ROOT键是否包含一个名为MyLibrary.AComVisibleClass的子项。 如果没有,那么您的库名称可能与您预期的不同。在注册表中搜索AComVisibleClass以查找正确的库名称。

原因2:64位问题:

如果问题发生在64位操作系统上,原因可能是您的VBScript作为32位进程运行而C#COM DLL是64位,反之亦然。

原因3:错误的功能名称:

您可能在脚本中使用了错误的函数名称,例如obj.SomeFnc(1)代替obj.SomeFunc(1),或者您选择的函数名称是VBScript中的保留关键字,或者包含不常见的字符。

答案 1 :(得分:0)

听起来你需要支持IDispatch

查看Does C# .NET support IDispatch late binding?

修改

这个答案可能有误,我可能最终会删除它。现在,它似乎增加了价值,所以我会留下它。