我在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
时才会抛出上述异常。
我知道这听起来有点(?)有点模糊,但我不能在这里公开真实的代码。如果有人需要更多信息,请问我。
答案 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?
修改的
这个答案可能有误,我可能最终会删除它。现在,它似乎增加了价值,所以我会留下它。