gpt4 book ai didi

c# - VB6 变体类型到 .NET 类型

转载 作者:太空狗 更新时间:2023-10-30 00:58:14 24 4
gpt4 key购买 nike

我有一些无法轻易修改的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com