3

我有一个 VB6 程序集,我需要在我的 .NET 应用程序中使用它,并通过tlbimp.exe生成用于 .NET 的 Interop 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 数组的方法。

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

4

2 回答 2

3

我不认为你可以在不修改 VB6 代码的情况下解决这个问题。尝试将函数声明为

Public Function GetData(ByRef data As Variant) As Integer

或者

Public Function GetData(ByRef data As Object) As Integer

to 字符串数组应该可以在ReDimVariant 中正常工作。我记得一直这样做是因为 VB6 不让二维数组作为参数。

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

如果一个作品你应该能够投射到String(,)你所期望的。

于 2013-08-27T14:47:06.940 回答
1

这是空气代码,但您可以在 VB.Net 中尝试一下吗?注意额外的逗号来表示一个二维数组。

Dim loadedData As String(,) = Nothing
于 2013-08-15T15:07:36.903 回答