使用Interop将对象数组从VB6返回到C#

时间:2009-03-10 17:57:25

标签: c# vb6 interop

我需要使用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 MyObj
  Next i

  CreateMyObjArray = temparray

End Function

现在,当我通过

传入数组后从C#调用它时
Array InData = m_MyObjGenerator.CreateMyOjbArray(5);

我得到一个system.argumentexceptionerror,消息是

“抛出了类型'System.ArgumentException'的异常。\ r \ n \ nParameter name:typeName @ 0”

如果我的函数没有参数,我也会收到此错误。该函数在一个表单的VB中工作。同样,以下函数返回一个MyObj就好了

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

我知道我可以在C#版本中创建一个新的MyObj列表,然后是.ToArray()它,但我真的想让它工作。感谢。

解决方案 找到了怎么做。我不得不使用没有/ sysarray标志的tlbimp.exe(VS必须在内部使用)。在那之后,我能够让一切正常运转。谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

很抱歉,我无法尝试使用某些代码来帮助您解决此问题。

话虽如此,将InData设置为Object Object InData = m_MyObjGenerator.CreateMyOjbArray(5);

执行该语句后,使用监视窗口确定InData的类型 修改代码(将InData的类型从Object更改为您使用监视窗口发现的类型)。

希望有所帮助。

答案 1 :(得分: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告诉您要使用的类型。