2013-08-15 1 views
1

У меня есть сборка VB6, которую я должен использовать в своем .NET-приложении, и сгенерировал DLL Interop для использования с .NET через tlbimp.exe.Маршал 2D массив от VB6 до .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: SafeArray ранга 2 был передан методу, ожидающий массив ранга 1.

мне действительно нужна помощь, чтобы решить эту проблему! Спасибо за любой совет!

ответ

2

Я не думаю, что вы можете решить эту проблему без изменения кода 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(,), которого вы ожидаете.

+0

не проверен, но имеет смысл. Я буду принимать это как ответ на вопрос. В итоге я создаю обходное решение. Создание новой функции в коде VB6, которая делает то же самое, но со структурами. Изменение существующего не было разрешено для меня (по соображениям совместимости с двоичными файлами). –

1

Это воздушный код, но вы можете попробовать это в VB.Net? Обратите внимание на дополнительную запятую, чтобы указать 2-мерный массив.

Dim loadedData As String(,) = Nothing 
+0

Я попробовал, но затем Visual Studio дает мне ошибку, что метод представляет собой простой массив строк, ожидающий. –

+0

Какой метод? VB6 'GetData'? Я знаю, что вы не хотите менять VB6, но вы можете попробовать также добавить запятую в объявлении публичного метода VB6, как это: 'Public Function GetData (ByRef data (,) As String) As Integer' – MarkJ

+0

VB6 не знает об этом определение. Я получаю ошибку при размещении запятой между круглыми скобками. Ошибка моего первого комментария приходит непосредственно из Visual Studio в коде VB.NET при вызове метода interop. –

 Смежные вопросы

  • Нет связанных вопросов^_^