私はこのC++コードを持っています:
extern "C" __declspec(dllexport) VOID AllocateFoo(MY_DATA_STRUCTURE** foo)
{
*foo = new MY_DATA_STRUCTURE;
//do stuff to foo
}
次に、C# で次のように関数を呼び出します。
[DllImport("MyDll.dll")]
static extern void AllocateFoo(out IntPtr pMyDataStruct);
...
MyDataStructure GetMyDataStructure()
{
IntPtr pData;
ManagedAllocateFooDelegate(out pData);
MyDataStructure foo = (MyDataStructure)Marshal.PtrToStructure(pData, typeof(MyDataStructure));
return foo;
}
MyDataStructure は MY_DATA_STRUCTURE に対応する構造体 (クラスではない) であり、メンバーは適切にマーシャリングされます。
質問: pData を保存してから、MyDataStructure が GC されたときにアンマネージ コードで再度解放する必要がありますか? MSDN は、Marshal.PtrToStructure(IntPtr, Type) について次のように述べています。その文の「マーシャル」は「コピー」を意味しますか? その場合、(IntPtr pData) を保持し、それを (MyDataStructure デストラクタ内の) アンマネージ コードに渡して、C++ の「削除」を実行できるようにする必要がありますか?
検索しましたが、これに対する十分に明確な答えを見つけることができません。