将二维数组从VB6封送至.NET



我有一个VB6程序集,需要在.NET应用程序中使用,并通过tlbimp.exe生成了用于.NET的互操作DLL

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的数组的方法。

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

我认为如果不修改VB6代码,就无法解决这个问题。尝试将函数声明为

Public Function GetData(ByRef data As Variant) As Integer

Public Function GetData(ByRef data As Object) As Integer

ReDim到字符串数组在Variant中应该可以正常工作。我记得我一直这样做,因为VB6不让2D数组作为参数。

当从.NET检查它时,您应该看到类型。我的机器上没有VB6 IDE来验证这一点。

如果一个有效,您应该能够转换到您期望的String(,)

这是air代码,但您可以在VB.Net中尝试一下吗?注意附加的逗号表示二维数组。

Dim loadedData As String(,) = Nothing

最新更新