备忘录:.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]

5. 参考

MSDN:什么是“托管代码”?

posted @ 2023-02-02 13:02  shanzm  阅读(507)  评论(0编辑  收藏  举报
TOP