我为c ++创建了一个C#COM互操作来调用。 我已经通过regasm注册了dll和tlb文件。 一切顺利,直到有一天我改变了C#部分的代码(我没有改变界面的定义,只是实现改变了)。 COM中的一个接口返回错误0x80131509。奇怪的是,它只发生在一些计算机上(我开发的PC运行良好,所以我无法调试这个问题)。 我不太清楚C#COM如何使用C ++,在我注册之后,我只知道它们在窗口注册表中创建了键值。(就像regasm / regfile生成的那样)。 c ++如何知道COM dll的位置(搜索路径环境变量)?什么在运行时使用tlb文件?
任何建议?
答案 0 :(得分:1)
我在COM库中引入了简单的继承层次结构后,就遇到了同样的错误。一种快速的解决方法是在基类上将ComVisible属性设置为true 。这立即解决了我的问题。
考虑到它确实很有意义-编译器不允许您建立一个层次结构,在该层次结构中,基类不如继承类可见。因此,对于COM而言,相同就不足为奇了-唯一的区别是,它在运行时而不是编译时失败。
我敢冒犯错误的真正原因是构造函数链断裂,但是我对此没有做进一步研究。
答案 1 :(得分:0)
我认为您的问题与注册表有关...您应该尝试在出现此问题的计算机中取消注册并使用regasm注册您的dll。
如果这不起作用,请在这些计算机中取消注册dll,而不是使用regedit搜索并删除任何缺少引用它的注册表项,然后再次注册您的dll。删除丢失的密钥后,您还可以使用其中一个注册表清理程序,以保证您不会遗漏任何内容。
请记住,您应该始终在应用程序将使用的目录中注册一个dll,这应该只发生一次。如果您需要取消注册一个DLL,那么您应该始终在您用于注册的目录中执行此操作。换句话说,一旦dll注册不移动。
注意:如果您的dll与C ++应用程序不在同一路径上,则它应位于PATH环境变量中引用的目录中。
答案 2 :(得分:0)
当我从Visual FoxPro调用.Net4 C#COM对象时,我收到了相同的错误消息。
该方法返回对象,其类型可以是其中之一。所有类型都派生自一个抽象类,它实现了与这些类型的公共东西的接口。
最终我决定从基类中删除abstract-modifier,然后将其设为public和ComVisible。这解决了我的问题,即使我希望基类是抽象的。