从VB6到.NET,如何将二维数组进行编组?

3

我有一个VB6程序集需要在我的.NET应用程序中使用,并生成Interop DLL以便通过tlbimp.exe与.NET一起使用。

VB6程序集有一个具有byref数组参数的函数。我不想更改VB6程序集中的任何内容,因此希望有解决方案使以下操作正常工作。

它正在填充数组,我希望在我的.NET代码(c#或vb.net)中使用它。

VB6函数示例(文件NativeClass.cls):

Public Function GetData(ByRef data() As String) As Integer
    Dim tResults() As String
    Dim sRecordCount As String
    Dim lCount As Long

    ' load data
    sRecordCount = dataDummyObject.RecordCount

    ReDim tResults(sRecordCount, 2)

    ' fill the array in a loop
    For lCount = 0 To sRecordCount - 1
        tResults(lCount, 0) = dataDummyObject.Fields("property1")
        tResults(lCount, 1) = dataDummyObject.Fields("property2")

        If (sRecordCount - 1 - lCount) > 0 Then
            Call dataDummyObject.MoveNext
        End If
    End For

    data = tResults
    GetData = sRecordCount
End Function

现在我希望从VB.NET中使用它:
Private _nativeAssembly As New NativeClass()

Public Function GetDataFromNativeAssembly() As String()
    Dim loadedData As String() = Nothing

    _nativeAssembly.GetData(loadedData)

    Return loadedData
End Function

C#版本:

private NativeClass _nativeAssembly = null;

public string[] GetDataFromNativeAssembly()
{
    string[] loadedData = null;

    _nativeAssembly.GetData(loadedData);

    return loadedData;
}

但是当我执行代码时,出现了以下异常:

System.Runtime.InteropServices.SafeArrayRankMismatchException: 已将秩为2的SafeArray传递给期望秩为1的数组的方法。

我真的需要帮助解决这个问题!感谢任何建议!

2个回答

3
我认为您无法在修改VB6代码的情况下解决这个问题。尝试将该函数声明为:
Public Function GetData(ByRef data As Variant) As Integer

或者
Public Function GetData(ByRef data As Object) As Integer
ReDim 转为字符串数组应该可以从变量中正常工作。我记得一直这样做是因为VB6不允许将2D数组作为参数。如果在.NET中进行检查,您应该能够看到类型。我没有VB6 IDE来验证这一点。如果一个能正常工作,您应该能够转换成您期望的 String(,)

尚未测试,但意义明确。最终我构建了一个解决方法。在VB6代码中创建一个新函数,它使用结构体完成相同的功能。由于二进制兼容性的原因,我不被允许修改现有函数。 - Felix C

1
这是空气代码,但你可以尝试在VB.Net中使用?注意额外的逗号表示二维数组。
Dim loadedData As String(,) = Nothing

我尝试了一下,但是Visual Studio给了我一个错误,说这个方法期望的是一个简单的字符串数组。 - Felix C
哪个方法?VB6的GetData吗?我知道你不想改变VB6,但你可以尝试在VB6公共方法声明中添加逗号,像这样:Public Function GetData(ByRef data(,) As String) As Integer - MarkJ
VB6不知道那个定义。当我在括号之间放逗号时,我会收到一个错误。我的第一个评论中的错误直接来自于在调用Interop方法时在VB.NET代码中的Visual Studio。 - Felix C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接