У меня есть код С++:
extern "C" __declspec(dllexport) VOID AllocateFoo(MY_DATA_STRUCTURE** foo)
{
*foo = new MY_DATA_STRUCTURE;
//do stuff to foo
}
Затем в С# я вызываю функцию таким образом:
[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'd? MSDN говорит для Marshal.PtrToStructure(IntPtr, Type): "Данные маршалов из неуправляемого блока памяти в новый выделенный управляемый объект указанного типа". В этом предложении "Маршалл" означает "копия"? В этом случае мне нужно будет сохранить (IntPtr pData), а затем передать его неуправляемому коду (в деструкторе MyDataStructure), чтобы я мог выполнить "удаление" на С++?
Я искал, но я не могу найти достаточно явный ответ для этого.