PtrToStructure()生成SafeArrayTypeMismatchException

时间:2010-12-28 00:33:30

标签: exception interop

民间,

请帮我追逐一下我SafeArrayTypeMismatchException。我需要将struct传递给非托管DLL。 struct成员之一是可变长度数组。非托管代码将使用数据填充它,然后我的C#代码将使用数据。

我的方法是:

  1. 使用IntPtr为我的结构获取StructureToPtr(),当然也要进行内存分配。
  2. 调用非托管函数,并将IntPtr作为参数传递
  3. 使用PtrToStructure()
  4. 获取已填充的结构

    如果为了练习的目的,我会背诵StructureToPtr()PtrToStructure(),但没有例外。

    如果我在PtrToStructure()SafeArrayTypeMismatchException之间调用非托管DLL,

    StructureToPtr()会生成PtrToStructure()SafeArrayTypeMismatchException的描述是“数组的运行时类型与元数据中记录的子类型之间发生了不匹配。”

    非常感谢任何建议或见解!

    如果需要,我可以发布我的代码。


    - 尼克

1 个答案:

答案 0 :(得分:1)

.NET marshaller无法处理未知大小的C / C ++数组。 .NET中的数组总是具有与之关联的固定大小,但C / C ++数组只是指向内存块的指针。 marshaller无法知道从C / C ++代码返回的数组有多大,因此它会引发异常。

在你的情况下尝试做的是将数组编组为一个COM类型的SafeArray - 一个包含它自己的大小的数组,但你的数组不是SafeArray。

没有办法让编组人员自动处理这个问题。声明您正在使用的结构成员作为IntPtr并手动创建.NET数组并复制值。请参阅this for an example如何执行此操作。