背景
最近在做后台快捷键的功能,当应用不被聚焦时,也需要响应快捷键的输入。于是就用到了Win32 API里的系统钩子,系统钩子会用到IntPtr去记录hookID,这些资源都是非托管资源,绕过了C#的内存管理系统。在网上搜索了腾讯云社区里关于GlobalKeyBoardHook的文章[1]后
作用
IDisposable是一个接口,用于在使用完资源后进行释放和清理。它定义了一个Dispose()方法,该方法用于释放由对象持有的非托管资源,如文件句柄、数据库连接、网络连接等。
托管资源/非托管资源区分
托管资源(Managed resources)
托管资源是由托管代码(managed code)创建和管理的资源。它们是由编程语言和运行时环境(.net CLR 的GC 机制)自动进行内存管理和垃圾回收的,无需显式释放的资源。托管资源包括但不限于以下内容:
- 托管对象(managed objects):由编程语言创建的对象,如类的实例、数组等。
- 托管堆上的内存(managed heap memory):由运行时环境分配和管理的内存。
- 托管文件句柄(managed file handles):由运行时环境分配和管理的文件句柄。
非托管资源(Unmanaged resources)
非托管资源是由非托管代码(unmanaged code)创建和管理的资源。它们不受编程语言和运行时环境的自动内存管理和垃圾回收机制控制,需要手动释放和清理。非托管资源包括但不限于以下内容:
- 非托管对象(unmanaged objects):由使用非托管语言(如C++)创建的对象。
- 非托管内存(unmanaged memory):由使用非托管语言分配的内存,如通过调用C的malloc函数分配的内存。
- 文件句柄(file handles):由操作系统分配的文件句柄,如打开的文件、数据库连接等。
- 网络连接(network connections):由操作系统分配的网络连接资源。
- Win32 API:Win32 API是一组用于访问Windows操作系统的函数和数据结构。这些函数和数据结构是以非托管的C/C++语言编写的,可以使用DllImport属性在C#中访问它们。
参考
[1] https://cloud.tencent.com/developer/information/C%23应用程序中的全局键盘捕获-article
标签:IDisposable,managed,句柄,托管,Unity,内存,分配,资源 From: https://www.cnblogs.com/JimmyZou/p/18291192