【问题标题】:Passing C# array of COM objects to VB6将 COM 对象的 C# 数组传递给 VB6
【发布时间】:2012-08-21 21:48:16
【问题描述】:

我正在尝试将 .NET 数组传递给 COM VB6 库。我有一个对象,它是 VB6 对象的 COM 包装器。它具有具有以下签名的方法:

[MethodImpl(MethodImplOptions.InternalCall, 
    MethodCodeType = MethodCodeType.Runtime)]
void AddEx([MarshalAs(UnmanagedType.Struct)] object vSafeArrayOfItems);

但是当我调用它时,我会收到带有以下消息的ArgumentException

值不在预期范围内。

异常的类型及其描述甚至不依赖于传递的元素。

有人知道如何解决这个问题吗?

UPD:我删除了 .NET 包装程序集和引用的源 .COM 库。没有发生任何变化。

【问题讨论】:

  • [MarshalAs] 属性显然是错误的。
  • 同意。 @user1453239 为什么你认为它是一个结构体?
  • 此声明来自我正在尝试使用的库。由第三方开发商提供。
  • 数组包含什么DataType?简单的数据类型,如字符串/整数或对象?

标签: c# arrays com vb6 marshalling


【解决方案1】:

您需要镜像 VB6 结构格式:

[StructLayout(LayoutKind.Sequential)]
public struct myStruct {
    type1 member1;
    type2 member2;
}

要导入你必须做的功能:

[DllImport("dllname.dll")]
public static extern void AddEx(IntPtr paramName);

您可以轻松使用以下函数来执行 struct IntPtr 转换:

myStruct struct = Marshal.PtrToStructure(paramName, typeof(myStruct));
// do stuff
Marshal.StructureToPtr(struct, paramName, false);

编辑:我误读了您想要做的事情。但这是进行互操作的开始。

参数异常来自尝试将引用类型作为值类型发送。 (对象是一个类,结构体的处理方式不同)

如果你想传递一个数组,你会这样做:

void AddEx([MarshalAs(UnmanagedType.LPArray)] ref myStruct[] param);

【讨论】:

    【解决方案2】:

    我认为你可以编写如下的外部方法声明:

    [DllImport...
    public static extern void AddEx(YourType[] paramName);
    
    //or like the following:
    
    public static extern unsafe void AddEx(YourType * paramName);
    

    【讨论】:

      猜你喜欢
      • 2018-07-29
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 2016-07-29
      • 1970-01-01
      相关资源
      最近更新 更多