2012-02-01 92 views
1

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

有什么建议吗?

回答

0

我认为你的问题与注册表有关...你应该尝试注销并注册(使用regasm)你的DLL在有这个问题的计算机上。

如果这样做不起作用注销这些计算机上的dll,而不是使用regedit搜索并删除引用它的任何缺少的注册表项,然后再次注册您的dll。删除缺失的密钥后,您也可以使用其中一个注册表清理程序,以确保您不会遗漏任何内容。

请记住,你应该注册一个dll到它将被你的应用程序使用的目录中,这应该只发生一次。如果你需要注销一个dll,那么你应该在注册时使用的目录中执行它。换句话说,一旦dll被注册不要移动它

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

+2

感谢您的回复。今天,我登录了问题PC,最终找到了错误的原因。这是因为C#COM部分抛出了一个异常,但我没有抓住它。我无法重现的原因是他们连接到差异数据库。 – ArdenZhao 2012-02-02 08:53:44

0

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

该方法返回对象,该对象的类型可能是其中的一个。所有类型都是从一个抽象类派生而来的,它为这些类型实现了一个通用接口。

最后,我决定从基类中删除abstract-modifier,并将其设置为公共和ComVisible。这解决了我的问题,即使我希望基类是抽象的。