нет Нет НЕТ НЕТ НЕТ !!!
Это
struct SOMESTRUCT
{
public SomeClass object_ref;
}
Правильный способ хранения ссылки в структуре.
Код, который вы написали, и принятый ответ нарушены на 100%.
Адрес, возвращаемый GC.AddrOfPinnedObject(GCHandle)
, действителен только тогда, когда GCHandle
не поврежден.Вы не должны звонить GCHandle.Free
, и вы не должны позволять GCHandle
быть собранным.В вашем коде адрес уже не имеет смысла к тому времени, когда вы сохраняете его.
Но вы должны просто позволить .NET позаботиться об управлении указателем во время сборки мусора, используя переменную ссылочного типа.Тогда вам не нужно прыгать через обручи.Единственная причина получить адрес управляемого объекта - это передать его в существующую встроенную функцию DLL, которая сохранит указатель после его возврата.Например, это необходимо для буферных массивов OpenGL.Это НЕ обязательно, когда-либо при вызове других методов C #.
Если SOMESTRUCT на самом деле является собственным типом данных, используемым некоторой функцией DLL, о которой вы не упомянули, то вам нужно убедиться, что GCHandle
жив.Только до тех пор, пока существует GCHandle
, указатель, который вы получили, останется действительным.