-1

我想了解如何使用非托管资源以及何时需要 SafeHandle 类。当您可以说:“哦,我需要 SafeHandle 类!”时,问题陈述可能是什么?

我将不胜感激文章,示例,解释的链接

4

1 回答 1

0

我认为MSDN的定义很明确:

SafeHandle 类提供句柄资源的关键终结,防止句柄被垃圾收集过早回收,并防止句柄被 Windows 回收以引用非预期的非托管对象。在 .NET Framework 2.0 版之前,所有操作系统句柄只能封装在 IntPtr 托管包装对象中。

SafeHandle 类包含一个终结器,可确保句柄已关闭并保证运行,即使在主机可能不信任 AppDomain 状态一致性的意外 AppDomain 卸载期间也是如此。

有关使用 SafeHandle 的好处的更多信息,请参阅安全句柄和关键终结。

此类是抽象的,因为您无法创建通用句柄。要实现 SafeHandle,您必须创建一个派生类。要创建 SafeHandle 派生类,您必须知道如何创建和释放操作系统句柄。这个过程对于不同的句柄类型是不同的,因为一些使用 CloseHandle,而另一些使用更具体的方法,例如 UnmapViewOfFile 或 FindClose。为此,您必须为每个操作系统句柄类型创建一个 SafeHandle 派生类;例如 MySafeRegistryHandle、MySafeFileHandle 和 MySpecialSafeFileHandle。其中一些派生类是预先编写的,并在 Microsoft.Win32.SafeHandles 命名空间中为您提供。

于 2022-02-10T15:56:51.183 回答