0

我有一些 .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 包装器?

我提供的代码是一个非常简短的摘要,但希望足以证明这个问题。

谢谢你的帮助

4

1 回答 1

0

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

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

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

不难修复,但很难找到问题。

希望这对其他人有帮助吗?

于 2013-11-07T04:11:43.773 回答