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

Calling C function from C#, passing struct which contains pointers

本文关键字:包含 指针 结构 调用 函数      更新时间:2023-10-16

我需要通过 C# 中的 PInvoke 调用 C 函数,将指针传递给结构体,并且该结构也包含一个指针。

该结构可以在 C 中简化为,

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 函数不会分配浮点指针指向的内存,它只会修改它。我宁愿在不使用不安全关键字的情况下解决此问题。

我已经使用 float[] 成功地通过带有 float* 参数的 PInvoke 调用函数,但这在这里似乎不起作用。

提前谢谢。

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);

这样,您就不会使用不安全的关键字。

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