【发布时间】:2010-07-13 19:19:51
【问题描述】:
我有一些无法轻易修改的 VB6 代码,如下所示:
Dim cCount as Long
Dim rCount as Long
Dim result()
Set mx = CreateObject("Component.Class")
Dim rtn = mx.GetList(rCount,cCount,result)
它调用的方法当前是一个 VB6 组件,我们已将其迁移到 .NET,但存在一个问题。我们不确定 result() 正在寻找什么类型,因为它是一个变体类型。我们尝试过object、object[]、object[][]、string、string[]等,都没有奏效。
这是一个例子:
public bool GetList(ref long rCount, ref long cCount, ref object result)
{
...
}
我什至尝试将第三个参数设置为 VariantWrapper,因为它会根据需要添加 ByRef:
public bool GetList(ref long rCount, ref long cCount, VariantWrapper result)
{
...
}
任何想法我可以将传入结果设置为什么,以便我没有未处理的异常?
我创建了一个测试接口(用于 COM)、测试类和测试 VB6 应用程序,以确保它是变体的问题。所以,它是这样定义的:
.NET 接口:
[DispId(1)]
[ComVisible(true)]
string Test(ref object[] value);
VB 6 方法:
Private Sub Command1_Click()
Set mx = CreateObject("Component.Class")
Dim result()
MsgBox mx.Test(result)
End Sub
与上述相同的问题。在 VB6 中,它只是让我失望。如果我编译并运行它,我会得到一个通用的 .NET 异常,它会把我扔出去。
【问题讨论】:
-
可以看到
result()是如何声明和传递的,但看不到GetList返回后是如何使用的? -
因此,当将 Variant() 类型分配给 result 并传递给 GetList 时,.NET 会报错。
-
添加 VariantWrapper 会给我一个错误 5 非法过程调用。
-
看看 .NET 中的反射,以完成过去在 VB6 中使用后期绑定完成的工作。
-
我已将我的问题提交给 VB 团队。最后我知道,他们认为我所做的应该有效。所以我向他们提交了一个完整的项目。我会在这里回复他们的回复。
标签: c# vb.net vb6 interop com-interop