C# 在C中将结构数组编组到指针#
我正在尝试调用一个非托管函数,该函数如下所示(数据是我的C#struct): 这就是我从C#调用函数的方式: 不幸的是,我得到了这个错误:“无法封送‘参数#1’:指针不能引用封送的结构。” 如果有什么不同,我的数据结构中有嵌套结构。我无法控制这个外部方法是如何设计的。调用此函数并接收结构数组的正确方法是什么?尝试以下方法:C# 在C中将结构数组编组到指针#,c#,interop,pinvoke,C#,Interop,Pinvoke,我正在尝试调用一个非托管函数,该函数如下所示(数据是我的C#struct): 这就是我从C#调用函数的方式: 不幸的是,我得到了这个错误:“无法封送‘参数#1’:指针不能引用封送的结构。” 如果有什么不同,我的数据结构中有嵌套结构。我无法控制这个外部方法是如何设计的。调用此函数并接收结构数组的正确方法是什么?尝试以下方法: [DllImport("data.dll")] internal static unsafe extern int MyExternalFunction(DATA[] pDa
[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,但我只是傻了。我认为没有办法将数据从本机恢复到托管中。一旦方法存在,封送员应该知道如何进行转换。不过我不是这些方面的专家