2009-03-10 2 views
4

Мне нужно вернуть массив инициализированных объектов из VB6 в C# с помощью interop. Моя функция VB выглядитВозвращает массив объектов от VB6 до C# с помощью Interop

Public Function CreateMyObjArray(ByVal MaxCount As Integer) As MyObj() 

    Dim i As Integer 
    Dim temparray() As MyObj 
    ReDim temparray(MaxCount) As MyObj 

    For i = 0 To MaxCount 
     Set temparray(i) = New MyObj 
    Next i 

    CreateMyObjArray = temparray 

End Function 

Теперь, когда я называю это из C# после прохождения в массиве по

Array InData = m_MyObjGenerator.CreateMyOjbArray(5); 

Я получаю system.argumentexceptionerror где сообщение

«Исключение type 'System.ArgumentException' было выбрано. \ r \ nПараметр: typeName @ 0 "

Я также получаю эту ошибку, если у моей функции нет параметров. Функция работает в VB из формы. Аналогично, следующая функция возвращает MyObj просто отлично

Public Function CreateMyObj() As MyObj 
Set CreateMyObj = New MyObj 
End Function 

Я знаю, что может составить список нового MyObj годов в C# версии, а затем .ToArray(), но я бы очень хотел, чтобы получить эту работу. Благодарю.

Решение Обнаружено, как это сделать. Мне пришлось использовать tlbimp.exe без флага/sysarray (который VS должен использовать внутри). После этого я смог все правильно работать. Спасибо за помощь, ребята!

ответ

2

Во-первых, давайте убирать, что VB немного:

Public Function CreateMyObjArray(ByVal MaxCount As Integer) As MyObj()  
    ''// MaxCount = 5 would allocate 6 array items with your old code 
    ''// Also: do this in one line rather than with an expensive "ReDim" 
    Dim temparray(MaxCount-1) As MyObj 

    Dim i As Integer 
    For i = 0 To MaxCount -1 
     Set temparray(i) = New MyObj 
    Next i 

    CreateMyObjArray = temparray 
End Function 

Наконец, C# должен выглядеть следующим образом:

MyObj[] InData = m_MyObjGenerator.CreateMyObjArray(5); 

Где MyObj является использование выстроил типа при разговоре с вашим кодом Vb , Как предложил другой плакат, вы можете установить его на Object и сделать шаг, чтобы Visual Studio сообщила вам, какой тип использовать именно.

+0

VS импортирует его как system.array, второй фрагмент кода приводит к ошибке компилятора. Спасибо за помощь. – Steve

+0

Да, я бы не ожидал, что он скомпилируется, потому что «MyObj» - это просто место для вашего реального типа. Чтобы пройти через System.Array, попробуйте использовать Object [], чтобы получить визуальную студию, чтобы указать тип одного элемента в массиве. –

3

Прошу прощения, что я не могу попробовать какой-то код, чтобы действительно помочь вам решить эту проблему.

Сказав это, установите InData как объект.
Object InData = m_MyObjGenerator.CreateMyOjbArray(5);

После выполнения этого оператора используйте окно просмотра, чтобы определить тип InData.
Измените код (измените тип InData из Object на тот тип, который вы обнаружили с помощью окна просмотра).

Надеюсь, что это поможет.

+1

+1 Это всегда должно быть первой попыткой. – erikkallen

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

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