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.
检查任何框架类型的源代码
我正在编写一个 .NET 应用程序,我必须在其中使用 API 调用(真的)。我的应用程序通过调用 Win API 的函数 CoCreateInstance()
.
当然,这些接口我用完了就得释放。我认为这样做的合适方法是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.
检查任何框架类型的源代码