【问题标题】:Marshaling arrays from VB.NET to COM object将数组从 VB.NET 编组到 COM 对象
【发布时间】:2009-05-25 08:49:21
【问题描述】:

我有一个调用 COM 方法的 VB6 程序,将 2 个数组作为参数传递并期望填充 2 个数组作为响应。

代码是这样的,其中 ItemIDs 和 ItemClientHandles 是输入数组参数,而 MyItemServerHandles 和 Errors 由 COM 对象填充。

Dim ItemIDs(2) As String
Dim ItemClientHandles(2) As Long
Dim Errors() As Long             ' Array for returned Item related errors
Dim MyItemServerHandles() As Long   ' Server Handles for Items

ItemIDs(1) = "2,VW1000,word"
ItemIDs(2) = "2,VW1002,word"

ItemClientHandles(1) = 1
ItemClientHandles(2) = 2

Call MyItems.AddItems(2, ItemIDs, ItemClientHandles, MyItemServerHandles, Errors)

现在我想从 VB.NET 调用相同的方法,并尝试使用类似的方法来定义数组:

<MarshalAs(UnmanagedType.LPArray, ArraySubType:=UnmanagedType.I4, SizeConst:=2)> Private MyItemServerHandles(2) As Int32 ' Server Handles for Items
<MarshalAs(UnmanagedType.LPArray, ArraySubType:=UnmanagedType.LPWStr, SizeConst:=2)> Private ItemIDs(2) As String
<MarshalAs(UnmanagedType.LPArray, ArraySubType:=UnmanagedType.I4, SizeConst:=2)> Private ItemClientHandles(2) As Int32
<MarshalAs(UnmanagedType.LPArray, ArraySubType:=UnmanagedType.I4, SizeConst:=2)> Dim Errors(2) As Int32 ' Array for returned Item related errors

但无法让它工作,因为我收到一个错误(我尝试从意大利语翻译):

不能从类型转换对象 'System.Int32[*]' 输入 'System.Int32[]'

将数组从 VB.NET 托管代码编组到非托管 COM 代码的正确方法是什么?

谢谢

【问题讨论】:

    标签: vb.net interop marshalling


    【解决方案1】:

    已解决。

    输出数组必须简单地声明为

    Private MyItemServerHandles As System.Array
    Private Errors As System.Array
    

    从调用返回时,它们将被正确编组为 Int32 数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-14
      • 2023-04-11
      • 1970-01-01
      • 2018-10-26
      • 2018-07-29
      • 2011-12-05
      • 1970-01-01
      相关资源
      最近更新 更多