我需要通过C#中的PInvoke调用C函数,将指针传递给结构,并且此结构也包含指针。
结构可以简化为C to,
struct myStruct {
int myInt;
float *myFloatPointer;
}
函数声明可以简化为
void myFunc(myStruct *a);
在C#中,我将该函数声明为
[DllImport("my_library.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void myFunc(ref myStruct a);
不幸的是,我无法确定如何使用指针参数在C#中声明结构。
C函数不分配浮点指针指向的内存,只修改它。我宁愿在不使用unsafe关键字的情况下解决这个问题。
我已经使用float []成功地通过PInvoke使用float *参数调用函数,但这似乎不起作用。
提前致谢。
答案 0 :(得分:2)
C指针本质上是不安全的,但您不需要在这里使用unsafe关键字,即使将使用基础概念。
您可以使用IntPtr:
声明结构struct myStruct
{
public int myInt;
public IntPtr myFloatPointer;
}
在固定浮点数组后用Marshal方法初始化字段:
float[] data = new float[15];
myStruct ms = new myStruct();
GCHandle gch = GCHandle.Alloc(data, GCHandleType.Pinned);
ms.myFloatPointer = Marshal.UnsafeAddrOfPinnedArrayElement(data, 0);
这样,您就不会使用unsafe关键字。
请注意,根据您运行的平台,指针的大小及其对齐方式可能会有所不同;结构可能需要一些特定的布局。