Marshal.Release() 是否有隐含的 ReliabilityContract?

Does Marshal.Release() have an implicit ReliabilityContract?

我正在编写一个 .NET 应用程序,我必须在其中使用 API 调用(真的)。我的应用程序通过调用 Win API 的函数 CoCreateInstance().

获取 COM 接口

当然,这些接口我用完了就得释放。我认为这样做的合适方法是Marshal.Release()(至少,我没有想到其他合理的方法)。

现在,我想让每个接口指针都成为安全句柄。为此,我必须从 SafeHandle 派生出我自己的安全句柄 class,并且必须在派生的 class 中覆盖 ReleaseHandle()respective documentation 状态:

[...] In particular, apply the ReliabilityContractAttribute attribute to any methods you call from ReleaseHandle. In most cases this code should be: ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success) [...]

这是我的问题:我不知道 Marshal.ReleaseHandle() 是否已经默认有这个合同,如果没有,我该如何添加它。我想我在这里缺乏一些基础知识。有人可以解释一下吗?

抽象方法的定义Marshal.Release

[System.Security.SecurityCritical]  // auto-generated_required
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static extern int /* ULONG */ Release(IntPtr /* IUnknown */ pUnk );

所以它已经用 ReliabilityContractAttribute 修饰了。您可以使用反编译器(我使用 JustDecompile)或在 referencesource.microsoft.com.

检查任何框架类型的源代码