Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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#_Interop_Pinvoke - Fatal编程技术网

C# 在C中将结构数组编组到指针#

C# 在C中将结构数组编组到指针#,c#,interop,pinvoke,C#,Interop,Pinvoke,我正在尝试调用一个非托管函数,该函数如下所示(数据是我的C#struct): 这就是我从C#调用函数的方式: 不幸的是,我得到了这个错误:“无法封送‘参数#1’:指针不能引用封送的结构。” 如果有什么不同,我的数据结构中有嵌套结构。我无法控制这个外部方法是如何设计的。调用此函数并接收结构数组的正确方法是什么?尝试以下方法: [DllImport("data.dll")] internal static unsafe extern int MyExternalFunction(DATA[] pDa

我正在尝试调用一个非托管函数,该函数如下所示(数据是我的C#struct):

这就是我从C#调用函数的方式:

不幸的是,我得到了这个错误:“无法封送‘参数#1’:指针不能引用封送的结构。”

如果有什么不同,我的数据结构中有嵌套结构。我无法控制这个外部方法是如何设计的。调用此函数并接收结构数组的正确方法是什么?

尝试以下方法:

[DllImport("data.dll")]
internal static unsafe extern int MyExternalFunction(DATA[] pData);
并完全省略C#指针

编辑:
我没有对此进行测试,但指针方式不起作用是有道理的,因为托管阵列的内存布局与非托管阵列的内存布局不同。封送处理程序必须有机会获取您的数组并将其转换为本机格式,然后再转换回来。我不确定在这种情况下是否需要ref修饰符,但它可能是一个选项。

您应该这样声明:

[DllImport("data.dll")]
public static extern int MyExternalFunction(
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]
    DATA[] Data, 
    uint numElements
);
MyExternalFunction(myArray, myArray.Length);
这样称呼它:

[DllImport("data.dll")]
public static extern int MyExternalFunction(
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]
    DATA[] Data, 
    uint numElements
);
MyExternalFunction(myArray, myArray.Length);

不需要不安全的或固定的。请删除所有这些内容。

根据您发布的内容,AZ的答案是正确的。省略不安全、跳过固定块并将外部函数参数声明为DATA[]。但是,您能告诉我们如何在C#端定义数据吗?这可能会使事情更加清楚。不需要不安全的或固定的。向我们展示C++代码和C语言定义<数据> <代码>。声明没有意义,没有办法让非托管代码找出数组中有多少元素。发布本机声明。我已经更新了代码,我忘了在这个示例中包含“numElements”参数,对不起。我还包括了结构布局。函数(MyExternalFunction)需要一个指针。我尝试了你的建议,它没有生成错误,但结构数组都是0。它看起来不起作用。当我添加一个ref修饰符时,程序只是在没有任何异常或错误的情况下退出,它只是关闭。我认为
ref
在这里是不正确的,这相当于
int MyExternalFunction(DATA**pData)
,的本机声明,即通过引用传递的数组。如果对输入数组执行的唯一初始化是DATA[]DATA=new DATA[64];那么逻辑上,它只包含本机的零side@Justin-你说得对。我认为OP希望使用更改的值将数组数据从本机恢复到托管状态。不知怎的,这在我的脑海中被翻译成ref,但我只是傻了。我认为没有办法将数据从本机恢复到托管中。一旦方法存在,封送员应该知道如何进行转换。不过我不是这些方面的专家