我正在编写一个.NET应用程序,我必须使用API调用(实际上)。我的应用程序通过调用Win API的函数SELECT *
FROM `events`
WHERE `category` LIKE '_1'
AND SortDate LIKE '%2017-02%'
AND status=1
来获取COM接口。
当然,我必须在完成它们后释放这些接口。我认为这样做的合适方法是CoCreateInstance()
(至少,我认为没有其他合理的方法)。
现在,我想让每个相应的界面指针成为一个安全的句柄。为此,我必须从Marshal.Release()
派生自己的安全句柄类,并且必须在派生类中重写SafeHandle
。 respective documentation州:
[...]特别是,应用ReliabilityContractAttribute属性 从ReleaseHandle调用的任何方法。在大多数情况下这个代码 应该是:ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)[...]
这是我的问题:我不知道默认情况下ReleaseHandle()
是否已经拥有此合约,如果没有,我怎么能添加它。我想我在这里缺乏一些基础知识。有人可以在那里阐明一下吗?
答案 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上的结果来检查任何框架类型的来源。