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