我在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时,才会抛出上述异常。
我知道这听起来有点(?)有点含糊,但我不能在这里公开真正的代码。如果有人需要更多信息,请问我。
发布于 2010-09-11 15:40:43
我能想到这个问题的三个可能的原因:
原因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中的保留关键字,或者它包含不常见的字符。
发布于 2010-09-11 06:02:25
听起来你需要支持IDispatch。
查看Does C# .NET support IDispatch late binding?
编辑
这个答案可能是错误的,我最终可能会删除它。就目前而言,它似乎增加了价值,所以我会让它留下来。
https://stackoverflow.com/questions/3688603
复制相似问题