代码返回强类型RCW和系统.__ ComObject,并失败并出现InvalidCastException

时间:2013-10-29 16:46:49

标签: .net vb.net com vb6 interop

我有一些.net代码和较旧的VB6代码,需要在两者之间进行交互和传递对象。我发现在不同的编码条件下,我会得到不同的结果,这会使代码不可靠。

当.net创建一个com对象时,会出现问题,它取决于该对象的创建方式(或.NET如何首先访问该对象?)。 com对象在VB6中定义并具有2个接口。当我需要通过InvalidCastException

访问代码失败的底层接口时,这会导致问题

下面是一些例子。

此代码以.net

编写

在VB6中,我们有一个名为Inter1和Inter2的对象。 Inter2实现了Inter1

'The following is a com object 
Dim ComObj as New Inter2
'In debug mode hovering over ComObj will display ComObjClass
Dim ComObj2 as Inter1 = Inter2
'This code you would expect to work - but fails with InvalidCastException

如果上面的代码像这样重写,那么它将起作用

'The following is a com object 
Dim ComObj as Inter2 = CreateObject("Inter2")
'In debug mode hovering over ComObj will display System.__ComObject
Dim ComObj2 as Inter1 = Inter2
'This code will now work as expected and Inter1 can be accessed.

我认为这个问题在某种程度上与RCW的创建方式有关。问题也出现在下面类似的代码中,我已经有了一个COM对象,该对象上的属性将返回另一个com对象,如下所示

'here we already have a com object called ComApp
Dim ComObj as Inter2 = ComApp.GetInter2
'In debug mode hovering over ComObj will display ComObjClass
Dim ComObj2 as Inter1 = Inter2
'This code you would expect to work - but fails with InvalidCastException

在我上面工作的应用程序中更常见,我没有简单的解决方案,因为该对象是由COM应用程序创建的并返回到.net应用程序。

我希望这里有一种方法可以强制.NET始终将RCW作为System .__ ComObject返回,而不是那些似乎是强类型的com包装器似乎不能正确支持继承?

我提供的代码非常简洁,但希望足以证明这个问题。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我找到了问题的解决方案,它与你如何将它链接到相关的dll有关。关键设置如下。

使用链接的com dll - 如果选择“嵌入互操作类型”选项= false,则会发生上述行为。

如果选择True,它们将始终作为system .__ ComObject返回,这解决了问题。

难以修复,但很难找到问题所在。

希望这可以帮助其他人吗?