民间,
请帮我追逐一下我SafeArrayTypeMismatchException
。我需要将struct
传递给非托管DLL。 struct
成员之一是可变长度数组。非托管代码将使用数据填充它,然后我的C#代码将使用数据。
我的方法是:
IntPtr
为我的结构获取StructureToPtr()
,当然也要进行内存分配。IntPtr
作为参数传递PtrToStructure()
如果为了练习的目的,我会背诵StructureToPtr()
和PtrToStructure()
,但没有例外。
PtrToStructure()
和SafeArrayTypeMismatchException
之间调用非托管DLL, StructureToPtr()
会生成PtrToStructure()
。 SafeArrayTypeMismatchException
的描述是“数组的运行时类型与元数据中记录的子类型之间发生了不匹配。”
非常感谢任何建议或见解!
如果需要,我可以发布我的代码。
- 尼克
答案 0 :(得分:1)
.NET marshaller无法处理未知大小的C / C ++数组。 .NET中的数组总是具有与之关联的固定大小,但C / C ++数组只是指向内存块的指针。 marshaller无法知道从C / C ++代码返回的数组有多大,因此它会引发异常。
在你的情况下尝试做的是将数组编组为一个COM类型的SafeArray - 一个包含它自己的大小的数组,但你的数组不是SafeArray。
没有办法让编组人员自动处理这个问题。声明您正在使用的结构成员作为IntPtr并手动创建.NET数组并复制值。请参阅this for an example如何执行此操作。