我知道这个话题在这里讨论过很多次,但我找不到适合我具体情况的答案。
我需要在 C# 中调用一个非托管 C 方法,该方法接受一个结构对象上的指针(我不会流利地说 C:
int doStuff(MYGRID* grid, int x);
但是结构本身引用了另一个结构对象:
struct MYGRID {
int hgap;
int vgap;
MYIMAGE* image;
}
struct MYIMAGE {
int res;
int width;
int height;
}
而且我还需要像这样直接设置图像指针:
MYGRID* pGrid = new MYGRID;
MYIMAGE* pImage = new MYIMAGE;
pGrid->image = pImage;
所以,我的问题是:在 C# 代码中,我应该使用“struct”对象并像 P/Invoke Interop Assistant 建议的那样通过“ref”传递它吗?这意味着以下代码:
MyGrid myGrid = new MyGrid();
MyImage myImage = new MyImage();
myGrid.image = Marshal.AllocHGlobal(Marshal.SizeOf(image)); // A IntPtr in my struct
myGrid.image = Marshal.StructureToPtr(image, myGrid.image, false);
doStuff(ref myGrid, 0);
或者我可以使用“类”而不是“结构”来获得非常简单的以下代码:
MyGrid myGrid = new MyGrid();
MyImage myImage = new MyImage();
myGrid.image = myImage;
doStuff(myGrid, 0);
在第一种情况下,我在 struct MyGrid 中使用“IntPtr”,在第二种情况下只使用 MyImage 对象。