从C#调用C函数,传递包含指针的struct

时间:2016-05-19 21:28:39

标签: c# c++ dll pinvoke

我需要通过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 *参数调用函数,但这似乎不起作用。

提前致谢。

1 个答案:

答案 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关键字。

请注意,根据您运行的平台,指针的大小及其对齐方式可能会有所不同;结构可能需要一些特定的布局。