3

.NET アプリケーションで使用する必要がある VB6 アセンブリがあり、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 では 2D 配列をパラメーターとして使用できないため、常にこのようにしていたことを覚えています。

.NET から検査すると、型が表示されます。これを確認するための VB6 IDE がマシンにありません。

String(,)いずれかが機能する場合は、期待どおりにキャストできるはずです。

于 2013-08-27T14:47:06.940 に答える