使用互操作将对象数组从VB6返回到C#

使用互操作将对象数组从VB6返回到C#,c#,vb6,interop,C#,Vb6,Interop,我需要使用互操作将初始化对象数组从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 MyOb

我需要使用互操作将初始化对象数组从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
现在,当我将数组传递给

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
我知道我可以在C#版本中列出新的MyObj,然后.ToArray()将其删除,但我真的很想让它正常工作。谢谢

解决方案
我知道怎么做了。我必须在没有/sysarray标志(VS必须在内部使用)的情况下使用tlbimp.exe。在那之后,我能够让一切正常工作。谢谢大家的帮助。

很抱歉,我无法尝试一些代码来真正帮助您解决这个问题

话虽如此,将
InData
设置为
对象

Object InData = m_MyObjGenerator.CreateMyOjbArray(5);
执行该语句后,使用“监视”窗口确定
InData
的类型。 修改代码(将
InData
的类型从
Object
更改为使用监视窗口发现的类型)


希望有帮助。

首先,让我们稍微清理一下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
最后,你应该像这样:

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

其中MyObj是与vb代码对话时使用的封送类型。正如另一张海报所建议的那样,您可以将其设置为
Object
,然后单步执行,让Visual Studio告诉您要使用的确切类型。

VS正在将其作为system.array导入,您的第二个代码段将导致编译器错误。谢谢你的帮助。是的,我不希望它被编译,因为“MyObj”只是你真实类型的占位符。要通过System.Array,请尝试在那里使用Object[],然后让visual studio告诉您数组中一个元素的类型。