【问题标题】:C# COM Class - DISP_E_UNKNOWNNAMEC# COM 类 - DISP_E_UNKNOWNNAME
【发布时间】:2010-09-10 21:48:37
【问题描述】:

我已经在 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时才会抛出上述异常。

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

【问题讨论】:

  • 你能添加你的 VBScript 代码吗(刚好足以看到调用的样子)?
  • 问题出在 VBScript 代码中。您没有发布该代码。

标签: c# .net-3.5 com vbscript


【解决方案1】:

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

原因 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 中的保留关键字或包含不寻常的字符。

【讨论】:

  • 我能够找出发生了什么。我只能说我的问题比我在这里描述的要复杂一些......但这是最有帮助的答案,因此会被接受。
【解决方案2】:

听起来你需要支持IDispatch

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

编辑

这个答案可能是错误的,我可能会最终删除它。就目前而言,它似乎增加了价值,所以我会让它留下来。

【讨论】:

  • .NET 默认为 ComVisible 内容公开双接口(即包括 IDispatch),所以这不应该是这里的问题。
  • @Pavel,你是对的。看起来IDispatch 已实现,但调用者未传入正确的名称。 (msdn.microsoft.com/en-us/library/…) 会不会区分大小写?
猜你喜欢
  • 2014-11-15
  • 2012-10-02
  • 2011-02-03
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多