В статье блога .Net по безопасности о SafeHandles упоминается, что вам необходимо применить атрибут ReliabilityContract к сигнатуре собственного метода, который закрывает дескриптор.
Когда мы наследуемиз SafeHandle мы должны объявить конструктор, метод ReleaseHandle и свойство IsInvalid, для каждого из которых в базовом классе применяется ReliabilityContract (я использовал Reflector, чтобы взглянуть на SafeHandle):
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
protected SafeHandle(IntPtr invalidHandleValue, bool ownsHandle);
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
protected abstract bool ReleaseHandle();
public abstract bool IsInvalid { [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] get; }
ReliabilityContract имеет его унаследованное свойство установлено в false - что, я думаю, означает, что методы, которые мы переопределяем, больше не будут иметь атрибута - так, нам нужно повторно применить атрибут?