Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PtrToStructure()生成SafeArrayTypeMismatchException_Exception_Interop - Fatal编程技术网

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的调用中收到了有效数据。