备忘录:.net中的托管与非托管
1. 概念
托管代码:由公共语言运行库环境(而不是直接由操作系统)执行的代码。 在这种情况下,相关的运行时称为公共语言运行时 (CLR), CLR 负责提取托管代码、将其编译成机器代码,然后执行它。 除此之外,运行时还提供多个重要服务,例如自动内存管理、安全检测、类型安全
-
说明1:当前创建一个引用类型的时候,CLR会为该引用类型分配内存,当对象失去引用的时候,就会触发GC进行自动回收。CLR体改的GC机制,带来的好处就是内存安全
所谓的内存安全就是程序只能访问已申请的内存,这样意味着不会存在野指针。 -
说明2:类型安全是指,CLR将程序每一块申请的内存都与一拽类型相关联,并保证被标记了类型的内存,只能进行该类型允许的操作。
-
说明3:自动内存管理是公共语言运行时在托管执行过程中提供的服务之一。 公共语言运行时的垃圾回收器为应用程序管理内存的分配和释放。
非托管代码:由操作系统直接执行的的代码称为非托管代码。如运行 C/C++ 程序,则运行的代码也称为“非托管代码”。
2. 特点
托管代码 享受CLR提供的服务,如垃圾回收,安全检测等。
非托管代码需要自行提供安全检测,垃圾回收等操作。
3. 区分
-
非托管资源的类型实现了IDisposable接口,实现了Dispose方法。在代码中若是不需要非托管资源,需要显示的调用Dispose()方法释放资源。
- 格式如下
try{}catch(){}finally{xxx.Dispose();}
,一般使用其语法糖using(……){……}
- 格式如下
-
典型的非托管资源:
- 文件,如FileStream
- 窗口,如From
- 网络连接,如Socket
- 数据库连接,如SqlConnection
4. C#调用托管DLL和非托管DLL
-
托管DLL就是DotNet环境下生成的DLL,可以直接添加引用
-
非托管DLL调用需要使用
[DLLImport]