Возврат массива объектов из VB6 в C # с использованием Interop - PullRequest
4 голосов
/ 10 марта 2009

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

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, где сообщение

"Возникло исключение типа '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 ]

3 голосов
/ 10 марта 2009

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

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

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

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

2 голосов
/ 10 марта 2009

Прежде всего, давайте немного очистим этот 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 сообщала вам, какой именно тип использовать.

...