この話題がここで何度も議論されたことは知っていますが、私の特定の状況に対する答えを見つけることができませんでした.
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# コードでは、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);
最初のケースでは、構造体 MyGrid で "IntPtr" を使用し、2 番目のケースでは MyImage オブジェクトのみを使用します。