我需要使用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必须在内部使用)。在那之后,我能够让一切正常运转。谢谢你的帮助。
答案 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告诉您要使用的类型。