Вопрос в том, как. Net среда выполнения понимает, что поля структуры, которая была помещена в память с помощью Marshal.StructureToPtr
, не должны быть освобождены G C.
Ниже сценария.
У меня есть следующая структура:
[StructLayout(LayoutKind.Sequential)]
public struct SomeStruct
{
public string s;
public Stream stream;
public SomeStruct(string s)
{
this.s = s;
this.stream = new MemoryStream(0x100);
}
}
Существует метод, который создает экземпляр структуры и помещает ее в память:
static IntPtr GetStructRawData()
{
IntPtr ptr = Marshal.AllocHGlobal(1024);
Marshal.StructureToPtr(new SomeStruct("hi"), ptr, false);
return ptr;
}
Затем я могу создать новую структуру из необработанная память:
IntPtr ptr = GetStructRawData();
GC.Collect();
SomeStruct struct2 = (SomeStruct)Marshal.PtrToStructure(ptr, typeof(SomeStruct));
После того, как struct2
действительно содержит правильную строку ("привет") и правильный поток. Таким образом, кажется, что есть ссылки на эту строку и на этот поток struct1
. Но что держит ссылки? Как среда выполнения понимает, что строка и поток не должны быть собраны?