То, что вы получаете, на самом деле не является адресом.
Как вы заметили, в большинстве случаев он действует как адрес, и вы можете вызвать объект, используя GCHandle.FromIntPtr. Однако интересная проблема заключается в том, что вы используете GCHandleType.WeakTrackResurrection .
Если ваш объект со слабой ссылкой получен (вероятно, может, так как GCHandle ссылается на него слабо), у вас все еще есть IntPtr, и вы можете передать его в GCHandle.FromIntPtr () . Если вы сделаете это, вы получите нулевое значение, при условии, что IntPtr не был переработан.
(Если по какой-либо причине CLR переработал IntPtr, у вас возникли проблемы. Я не уверен, может ли это произойти.)
Вам лучше использовать либо GCHandleType.Normal , либо GCHandleType.Pinned (если вам нужно взять адрес объекта в неуправляемом коде), если вы хотите сильный ссылка на объект.
(Чтобы использовать GCHandleType.Pinned, ваш объект должен быть, например, примитивным, иметь атрибут [StructLayout] или быть массивом таких объектов.)