我有一些无法轻松修改的 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)
{
  ...
}

任何想法我可以将传入的结果设置为什么,以便我没有未处理的异常?

我已经创建了一个测试接口(interface)(用于 COM)、测试类和测试 VB6 应用程序,以确保它是 Variant 的问题。所以,它是这样定义的:

.NET 接口(interface):
[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 异常并将我抛出。

最佳答案

您的 C# 声明是错误的。由于历史原因,VB6“Long”是 32 位。这是 C# 端的 int。如果堆栈帧错误,您就不可能正确传递“结果”参数。

它应该是一个 SafeArray of Variants,C# 中的 object[]。

关于c# - VB6 变体类型到 .NET 类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3240634/

10-13 08:57