簡體   English   中英

使用互操作將對象數組從 VB6 返回到 C#

[英]Return array of objects from VB6 to C# using Interop

我需要使用互操作將一組初始化對象從 VB6 返回到 C# 中。 我的 VB function 看起來像

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參數名稱: typeName@0"

如果我的 function 沒有參數,我也會收到此錯誤。 function 在 VB 中從一個表單工作。 同樣,下面的 function 返回一個 MyObj 就好了

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

我知道我可以在 C# 版本中列出新的 MyObj 列表,然后使用.ToArray() 它,但我真的很想讓它工作。 謝謝。

解決方案找到了如何做到這一點。 我必須使用沒有 /sysarray 標志的 tlbimp.exe(VS 必須在內部使用)。 在那之后,我能夠讓一切正常工作。 謝謝你們的幫助。

很抱歉,我無法嘗試一些代碼來真正幫助您解決這個問題。

話雖如此,將InData設置為Object

Object InData = m_MyObjGenerator.CreateMyOjbArray(5);

該語句執行后,使用手表 window 來確定InData的類型。 修改代碼(將Object InData為您使用監視窗口發現的類型)。

希望有幫助。

首先讓我們清理一下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 告訴您確切使用的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM