PtrToStructure()生成SafeArrayTypeMismatchException
各位 请帮我找出我得到的PtrToStructure()生成SafeArrayTypeMismatchException,exception,interop,Exception,Interop,各位 请帮我找出我得到的安全阵列类型不匹配异常。我需要将结构传递给非托管DLL。struct成员之一是可变长度数组。非托管代码将用数据填充它,然后我的C代码将使用数据 我的做法是: 使用StructureToPtr()为我的结构获取IntPtr,当然也要进行内存分配 调用非托管函数,并将IntPtr作为参数传递 使用PtrToStructure() 如果为了练习的目的,我背对背调用StructureToPtr()和PtrToStructure()没有例外 PtrToStructure()如果我在
安全阵列类型不匹配异常。我需要将结构传递给非托管DLL。struct
成员之一是可变长度数组。非托管代码将用数据填充它,然后我的C代码将使用数据
我的做法是:
使用StructureToPtr()
为我的结构获取IntPtr
,当然也要进行内存分配
调用非托管函数,并将IntPtr
作为参数传递
使用PtrToStructure()
如果为了练习的目的,我背对背调用StructureToPtr()
和PtrToStructure()
没有例外
PtrToStructure()
如果我在StructureToPtr()
和PtrToStructure()
之间调用非托管DLL,则生成SafeArrayTypeMismatchException
。SafeArrayTypeMismatchException
的描述是“数组的运行时类型与元数据中记录的子类型之间发生了不匹配。”
非常感谢您的任何建议或见解
如果需要,我可以发布我的代码
-Nick.NET封送处理程序无法处理大小未知的C/C++数组。NET中的数组总是有固定大小的关联,但C/C++数组只是指向内存块的指针。封送拆收器无法知道从C/C++代码返回的数组有多大,因此会引发异常
在您的案例中,它试图将数组封送为SafeArray,这是一种COM类型—一种包含自身大小的数组,但您认为该数组不是SafeArray
没有办法让封送员自动处理这个问题。声明要用作IntPtr的结构成员,并手动创建.NET数组并复制其中的值。看看如何做到这一点。也许,你关于SafeArray的一段为我指明了正确的方向。经过一番摸索之后,我将数组更改为一个带有[Marshallas(UnmanagedType.ByValTStr,SizeConst=256)]的字符串。我似乎从对非托管DLL的调用中收到了有效数据。