Marshal.Release()有一个隐含的ReliabilityContract吗?

时间:2017-02-08 16:14:20

标签: c# .net vb.net com safehandle

我正在编写一个.NET应用程序,我必须使用API​​调用(实际上)。我的应用程序通过调用Win API的函数SELECT * FROM `events` WHERE `category` LIKE '_1' AND SortDate LIKE '%2017-02%' AND status=1 来获取COM接口。

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

现在,我想让每个相应的界面指针成为一个安全的句柄。为此,我必须从Marshal.Release()派生自己的安全句柄类,并且必须在派生类中重写SafeHandlerespective documentation州:

  

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

这是我的问题:我不知道默认情况下ReleaseHandle()是否已经拥有此合约,如果没有,我怎么能添加它。我想我在这里缺乏一些基础知识。有人可以在那里阐明一下吗?

1 个答案:

答案 0 :(得分: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上的结果来检查任何框架类型的来源。