我有一些.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包装器似乎不能正确支持继承?
我提供的代码非常简洁,但希望足以证明这个问题。
感谢您的帮助
答案 0 :(得分:0)
我找到了问题的解决方案,它与你如何将它链接到相关的dll有关。关键设置如下。
使用链接的com dll - 如果选择“嵌入互操作类型”选项= false,则会发生上述行为。
如果选择True,它们将始终作为system .__ ComObject返回,这解决了问题。
难以修复,但很难找到问题所在。
希望这可以帮助其他人吗?