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

4
我需要使用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);

我遇到了一个系统参数异常错误,错误信息为

"Exception of type 'System.ArgumentException' was thrown.\r\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个回答

3

很抱歉我不能尝试一些代码来帮助你真正解决这个问题。

话虽如此,请将InData设置为一个Object

Object InData = m_MyObjGenerator.CreateMyOjbArray(5);

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

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);

当与您的VB代码交互时,MyObj是序列化类型。正如另一位发帖者建议的那样,您可以将其设置为Object并跳转到它,以让Visual Studio告诉您要使用什么类型。


VS 正在将其导入为 system.array,您的第二段代码片段会导致编译器错误。感谢您的帮助。 - Steve
是的,我不会期望它能编译通过,因为“MyObj”只是您真实类型的占位符。为了通过System.Array,尝试在那里使用Object[],然后让Visual Studio告诉您数组中一个元素的类型。 - Joel Coehoorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接