我有一些 .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 包装器?
我提供的代码是一个非常简短的摘要,但希望足以证明这个问题。
谢谢你的帮助