【发布时间】:2014-11-11 18:22:50
【问题描述】:
在 SafeHandles 的 .Net security blog article 中,它提到您需要将 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 有its inherited property set to false——我认为这意味着我们覆盖的方法将不再具有该属性——那么,我们是否需要重新应用该属性?
【问题讨论】:
-
您承诺您已经测试了您的代码并验证它不会破坏依赖于关键终结器的自定义 CLR 主机的状态。你是否?如果您实际上没有在这样的主机上运行(实际上是 SQL Server),那么这并不重要。
-
昨天在同一主题上遇到了一些困难,我想补充以下几点:
SafeHandle的源代码(截至本文撰写时)指出 每个方法 i> 你从ReleaseHandle()调用(不仅是关闭句柄的本机方法)应该有ReliabilityContract。另请注意,句柄并非必要被本机方法关闭;但即使它们被托管方法关闭,托管方法也应该有ReliabilityContract。