IntPtr
- это простая целочисленная структура, которая может содержать указатель (т. Е. 32-разрядный размер в 32-разрядных системах, 64-разрядный размер в 64-разрядных системах).
SafeHandle
- это класс, предназначенный для хранения дескрипторов объекта Win32 - он имеет финализатор, который обеспечивает закрытие дескриптора, когда объект GC-объект. SafeHandle
является абстрактным классом, потому что разные дескрипторы Win32 имеют разные способы их закрытия. До введения SafeHandle
, IntPtr
использовался для хранения дескрипторов Win32, но ответственность за обеспечение того, чтобы они были должным образом закрыты и защищены от GC, была обязанностью программиста.
HandleRef
- это способ убедиться, что неуправляемый дескриптор не GC, когда вы находитесь в середине вызова P / Invoke. Без чего-то вроде HandleRef
, если ваш управляемый код ничего не делает с дескриптором после вызова P / Invoke, если GC был запущен во время вызова P / Invoke, он не осознает, что дескриптор все еще используется, и может GC это. Я представляю (но я не уверен и не смотрел), что SafeHandle
может использовать HandleRef
как часть управления инкапсулированным дескриптором.