将C#数组的COM对象传递给VB6

Edu*_*ner 6 c# arrays vb6 com marshalling

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

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

但是当我打电话给它时,我收到ArgumentException以下消息:

价值不在预期范围内.

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

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

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

Mar*_*anu 0

您需要镜像 VB6 结构格式:

[StructLayout(LayoutKind.Sequential)]
public struct myStruct {
    type1 member1;
    type2 member2;
}
Run Code Online (Sandbox Code Playgroud)

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

[DllImport("dllname.dll")]
public static extern void AddEx(IntPtr paramName);
Run Code Online (Sandbox Code Playgroud)

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

myStruct struct = Marshal.PtrToStructure(paramName, typeof(myStruct));
// do stuff
Marshal.StructureToPtr(struct, paramName, false);
Run Code Online (Sandbox Code Playgroud)

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

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

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

void AddEx([MarshalAs(UnmanagedType.LPArray)] ref myStruct[] param);
Run Code Online (Sandbox Code Playgroud)