我正在尝试将.NET数组传递给COM VB6库。我有一个对象是VB6对象的COM包装器。它具有以下签名的方法:
[MethodImpl(MethodImplOptions.InternalCall,
MethodCodeType = MethodCodeType.Runtime)]
void AddEx([MarshalAs(UnmanagedType.Struct)] object vSafeArrayOfItems);
但是当我打电话给它时,我得到一个ArgumentException
,其中包含以下消息:
价值不在预期范围内。
异常的类型及其描述甚至不依赖于传递的元素。
有人知道如何解决这个问题吗?
UPD:我删除了.NET包装器程序集和引用的源.COM库。没有发生任何变化。
答案 0 :(得分:0)
我认为您可以编写如下的外部方法声明:
[DllImport...
public static extern void AddEx(YourType[] paramName);
//or like the following:
public static extern unsafe void AddEx(YourType * paramName);
答案 1 :(得分:0)
您需要镜像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);