Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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
C# 如何将对象数组传递给非托管代码?_C#_C++_Arrays_Marshalling_Unmanaged - Fatal编程技术网

C# 如何将对象数组传递给非托管代码?

C# 如何将对象数组传递给非托管代码?,c#,c++,arrays,marshalling,unmanaged,C#,C++,Arrays,Marshalling,Unmanaged,我试图把一组对象从C++传递到非托管C++,但似乎没有任何作用。 编译器不会让我假装数组是IntPtr。将数组强制转换为IntPtr不起作用。我试图传递固定数据的地址,但这也不起作用 我只需要传递一个指向数组开头的指针,这变得非常困难 有什么建议或链接吗?塔克斯 你能转换为空指针吗?确保对象数组已固定。最终起作用的是: 传递结构数组而不是对象数组(引用) 将“[StructLayout(LayoutKind.Sequential,Pack=1)]”放在结构定义之前 在字符串(在Strutt定义中

我试图把一组对象从C++传递到非托管C++,但似乎没有任何作用。 编译器不会让我假装数组是IntPtr。将数组强制转换为IntPtr不起作用。我试图传递固定数据的地址,但这也不起作用

我只需要传递一个指向数组开头的指针,这变得非常困难


有什么建议或链接吗?塔克斯

你能转换为空指针吗?确保对象数组已固定。

最终起作用的是:

  • 传递结构数组而不是对象数组(引用)
  • 将“[StructLayout(LayoutKind.Sequential,Pack=1)]”放在结构定义之前
  • 在字符串(在Strutt定义中)之前放置“[ MarshalAs(unMaundType,LPWSTR)),使字符串在C++侧出现为宽字符串。
  • 为DllImport声明中的参数声明结构数组:“VariableObject[]varObj”
  • 声明一个指针作为C++的参数。(C++类镜像C的结构):“变量对象*VAROBJ”。< /LI> 在C#/Managed方法签名中,用[Marshallas(UnmanagedType.LPArray,SizeParamIndex=0)]标记输入参数


    那就照常说吧。此外,在非托管代码中,可以修改此数组。我建议您发送一个额外的int,告诉非托管代码数组的大小,以防止“数组越界”修改。

    我尝试过:VariableObject[]varObj=new VariableObject[numVarObjects];GCHandle pinnedData=GCHandle.Alloc(varObj,GCHandleType.Pinned);IntPtr ptr=pinnedData.AddrOfPinnedObject();Alloc调用的结果是:“对象包含非基本数据或不可blittable数据。”。无法获取指向托管类型的指针。托管类型的数组也是托管类型,对象引用是托管类型。您希望如何从非托管代码中看到数组(即元素类型)?我希望(在C语言和C++方面都有相同的对象定义)。被叫函数有一个指向这个类型的指针作为参数。你是指C++类定义吗?这样不行。在CLR类的内存布局中,定义了实现,不能与C++匹配。您可以做的是让对象实现一些接口,并在非托管大小上提供该接口的非托管定义,然后让P/Invoke封送数组。如果我将CLR类更改为struct会更容易吗?如果你的结构本身不包含任何对象引用,并且如果你真正想要的是一个结构数组而不是引用数组(因为后者是你实际拥有的对象数组),那么,是的,它应该可以工作。
    [DllImport(...)]
    public void DoTask
        (
            ...,
            [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] int[] results,
            ...
        );