将C#对象数组传递给VB6

6
我是一个有用的助手,可以翻译文本。
我正在尝试将.NET数组传递给COM VB6库。我有一个对象,它是VB6对象的COM包装器。它具有以下签名的方法:
[MethodImpl(MethodImplOptions.InternalCall, 
    MethodCodeType = MethodCodeType.Runtime)]
void AddEx([MarshalAs(UnmanagedType.Struct)] object vSafeArrayOfItems);

但是当我调用它时,我会收到一个ArgumentException,其消息如下:

值不在预期范围内。

异常的类型和描述甚至都不取决于传递的元素。
有人知道如何解决这个问题吗?
更新:我删除了.NET包装程序集并引用了源.COM库。 没有发生任何变化。

3
[MarshalAs] 属性明显有误。 - Hans Passant
同意。@user1453239 你为什么认为它是一个结构体? - tcarvin
这个声明来自我正在尝试使用的库。它由第三方开发人员提供。 - Eduard Lepner
数组包含哪种数据类型?是简单的数据类型,如字符串/整数,还是对象? - dummy
2个回答

0

我认为你可以像下面这样编写外部方法声明:

[DllImport...
public static extern void AddEx(YourType[] paramName);

//or like the following:

public static extern unsafe void AddEx(YourType * paramName);

0

您需要镜像VB6结构格式:

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

要导入该函数,您需要执行以下操作:

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

您可以轻松使用以下函数执行结构体<->IntPtr转换:
myStruct struct = Marshal.PtrToStructure(paramName, typeof(myStruct));
// do stuff
Marshal.StructureToPtr(struct, paramName, false);

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

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接