从 C# 调用 C 函数,传递包含指针的结构
Calling C function from C#, passing struct which contains pointers
我需要通过 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指针指向的内存,只是修改它。我宁愿不使用 unsafe 关键字来解决这个问题。
我已经使用 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);
这样,您就不会使用 unsafe 关键字。
请注意,根据您 运行 所在的平台,指针的大小及其对齐方式可能会有所不同;该结构可能需要一些特定的布局。
我需要通过 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指针指向的内存,只是修改它。我宁愿不使用 unsafe 关键字来解决这个问题。
我已经使用 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);
这样,您就不会使用 unsafe 关键字。
请注意,根据您 运行 所在的平台,指针的大小及其对齐方式可能会有所不同;该结构可能需要一些特定的布局。