使用互操作将对象数组从VB6返回到C#
我需要使用互操作将初始化对象数组从VB6返回到C#。我的VB函数看起来像使用互操作将对象数组从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
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告诉您数组中一个元素的类型。