从 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[] 成功地通过带有 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);
这样,您就不会使用不安全的关键字。
请注意,根据您运行的平台,指针的大小及其对齐方式可能会有所不同;结构可能需要一些特定的布局。
相关文章:
- 如何在C++中重新实现包含指针的 STL 容器的类的迭代器
- 如何填充包含指针数组的结构数组
- 对列表类中的泛型方法禁用编译器警告 2100,该泛型方法可能包含指针,也可能不包含指针
- 包含指针成员的嵌套结构
- 如何在两个包含指针的地图中创建列表
- 为什么包含指针的条件总是返回 true?
- C 中的堆是否包含类和结构对象,或者仅包含指针
- 当通过引用传递包含指针成员的类对象时,为什么要多次调用析构函数?我该如何更正
- 可以使用memcpy()来复制包含指针的结构吗
- 从 C# 调用 C 函数,传递包含指针的结构
- 如何克隆包含指针的对象
- C++包含包含指针的对象的对象析构函数
- 当对象包含指针成员时,堆栈上的对象销毁出现分段错误
- 指向结构的指针包含指针
- 对象必须包含指针成员才能与其他对象通信
- 是否可以将包含指针的矢量放入共享托管内存中
- 提升:包含指针的类实例的序列化
- C++包含指针向量的类的析构函数
- 如何在 c++ 中将包含指针变量的对象写入和读取到文件中?帮助我使用以下代码
- C++:std::vector::reserve在包含指针时不保留