1

我正在编写一个 .NET 应用程序,我必须使用 API 调用(真的)。我的应用程序通过调用 Win API 的函数来获取 COM 接口CoCreateInstance()

当然,我必须在完成这些接口后释放它们。我认为这样做的适当方法是Marshal.Release()(至少,我没有想到其他合理的方法)。

现在,我想让每个相应的接口指针成为一个安全句柄。为此,我必须从中派生我自己的安全句柄类,SafeHandle并且必须在派生类中重写ReleaseHandle()。相应的文档指出:

[...] 特别是,将 ReliabilityContractAttribute 属性应用于您从 ReleaseHandle 调用的任何方法。在大多数情况下,此代码应为: ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success) [...]

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

4

1 回答 1

2

抽象方法的定义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上检查任何框架类型的源代码。

于 2017-02-08T17:30:05.557 回答