【问题标题】:C++ calling C# COM interop error: HRESULT 0x80131509C++ 调用 C# COM 互操作错误:HRESULT 0x80131509
【发布时间】:2012-02-23 23:56:56
【问题描述】:

我创建了一个 C# COM 互操作供 c++ 调用。 我已经通过 regasm 注册了 dll 和 tlb 文件。 一切都很顺利,直到有一天我更改了 C# 部分的代码(我没有更改接口的定义,只是更改了实现)。 COM 中的一个接口返回错误 0x80131509。奇怪的是,它只发生在某些电脑上(我的开发电脑运行良好,所以我无法调试这个问题)。 我不太清楚 C# COM 如何与 C++ 一起工作,在我注册它们之后,我只知道它们在窗口注册表中创建了键值。(就像 regasm /regfile 生成的一样)。 c++ 如何知道 COM dll 在哪里(搜索路径环境变量)? tlb文件在运行时有什么用?

有什么建议吗?

【问题讨论】:

    标签: c# com interop


    【解决方案1】:

    当我在我的 COM 库中引入一个简单的继承层次结构时,我得到了同样的错误。一个快速的解决方法是在基类上将ComVisible 属性设置为true。这立即解决了我的问题。

    仔细想想,这确实很有意义——编译器不允许您构建基类比继承类更不可见的层次结构。因此,对于 COM 来说,它是相同的也就不足为奇了 - 唯一的区别是,它在运行时而不是编译时失败。

    我敢说错误的真正原因是构造函数链损坏,但我没有进一步研究。

    【讨论】:

    • 谢谢。我已经尝试修复此问题 6 小时!将 ComVisible 设置为 false,得到 0x80131509,源代码为空。删除了 ,效果很好。
    【解决方案2】:

    我认为您的问题与注册表有关...您应该尝试在出现此问题的计算机中取消注册并注册(使用 regasm)您的 dll。

    如果这不起作用,请在这些计算机中取消注册 dll,然后使用 regedit 搜索并删除任何缺少的引用它的注册表项,然后再次注册您的 dll。您还可以在删除丢失的键后使用其中一个注册表清理程序,以确保您没有遗漏任何内容。

    请记住,您应该始终在您的应用程序将使用的目录中注册一个 dll,并且这应该只发生一次。如果您需要注销 dll,那么您应该始终在用于注册的同一目录中进行。换句话说,一旦注册了 dll,不要移动它

    注意:如果您的 dll 与您的 C++ 应用程序不在同一路径上,则它应该位于 PATH 环境变量中引用的目录中。

    【讨论】:

    • 感谢您的回复。今天,我登录到问题PC,终于找到了出错的原因。这是因为 C# COM 部分引发了异常,但我没有抓住它。我无法重现的原因是它们连接到不同的数据库。
    【解决方案3】:

    当我从 Visual FoxPro 调用 .Net4 C# COM 对象时,我收到了同样的错误消息。

    该方法返回对象,其类型可能是几个之一。所有类型都派生自一个抽象类,该抽象类实现了与这些类型通用的接口。

    最终我决定从基类中删除抽象修饰符,并将其设为公共和 ComVisible。这解决了我的问题,即使我希望基类是抽象的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-05
      • 2011-02-13
      • 2010-12-14
      • 2011-05-12
      • 2010-10-02
      • 2010-12-27
      • 1970-01-01
      • 2014-02-09
      相关资源
      最近更新 更多