Это немного подозрительно.HandleRef не требуется, когда значения дескрипторов хранятся в производном объекте SafeHandle.Пакет кода объявляет ZeroInvalidHandle с несколькими производными от него, такими как SafeWindowHandle.
Однако на самом деле он не использует ни один из этих классов SafeHandle нигде.Не уверен, действительно ли это так, многие расширения Vista и Win7 на самом деле являются интерфейсами COM.Не традиционный C API на основе дескрипторов.Они сохраняются благодаря подсчету ссылок и, следовательно, не подвержены такому сбою сборщика мусора.
Лично я никогда не беспокоюсь об этом.Получение объекта класса, собранного во время вызова API, является ошибкой.Это может произойти так же легко, как микросекунда после вызова API.Все еще ошибка, но не та, которая вызывает сбой вызова API.Не уверен, что я действительно хотел бы, чтобы это не сработало, я бы предпочел исключение, когда я получил ошибку в своем коде.Microsoft должна защитить себя от этого, они не хотят обвинять в этом исключение.Я делаю.