zoukankan      html  css  js  c++  java
  • .Net 托管代码和非托管代码,中间语言和执行,互操作

    托管代码和非托管代码

    Net Framework 是由彼此独立又相关的两部分组成:CLR 和 类库, CLR是它为我们提供的服务,类库是它实现的功能.

      .NET的大部分特性----垃圾收集,版本控制,线程管理等,都使用了CLR提供的服务

    当你为.NET Framework编译源代码的时候,得到的目标代码不是CPU能识别的机器指令,而是一种叫做"微软中间语言(MSIL,或简称为IL的代码)"的新语言.CLR提供了一个实时编译器,

    用来把IL代码编译为本机机器代码.这样一来,CLR能够使代码变得可移植,因为.NET应用程序的源代码必须被编译为IL代码,这些IL代码可以运行在任何提供CLR服务的平台上.CLR的角度来看,

    所有的语言都是平等的,只要有一个能生成IL代码的编译器就行,这就确保了各种语言的互操性.

    Mmanaged code-托管代码

    由公共语言运行库(CLR)环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。

    这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为

    托管代码就是执行过程交由运行时管理的代码。 在这种情况下,相关的运行时称为公共语言运行时 (CLR),不管使用的是哪种实现(Mono.NET Framework .NET Core)。 CLR 负责提取托管代码、将其编译成机器代码,然后执行它。 除此之外,运行时还提供多个重要服务,例如自动内存管理、安全边界、类型安全,等等。

    托管代码是使用可在 .NET 上运行的一种高级语言(例如 C#Visual BasicF# 等)编写的。 使用相应的编译器编译以这些语言编写的代码时,无法获得机器代码, 而是获得中间语言代码,然后运行时会对其进行编译并将其执行。 C++ 是这条规则的一个例外,因为它也能够生成可在 Windows 上运行的本机非托管二进制代码。

    Unmanaged Code - 非托管代码

    在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。

    相反,如果运行 C/C++ 程序,则运行的代码也称为“非托管代码”。 在非托管环境中,程序员需要亲自负责处理相当多的事情。 实际的程序在本质上是操作系统 (OS) 载入内存,然后启动的二进制代码。 其他任何工作 - 从内存管理到安全考虑因素 - 对于程序员来说是一个不小的负担。

    能被自动回收的就是托管.不能被自动回收的就是非托管.系统的东西就是托管的.

    .net的堆就是托管堆.没有非托管堆.引用类型的引用目标就是在堆里.

    值类型的值就在栈里.

    所谓的系统资源.是指:网络连接,数据库连接.文件流.这种东西.

    这里的托管就是指被CLR管理,托管堆就是被CLR管理的堆。非托管资源需要手动释放,托管资源由GC帮你打理。

    中间语言和执行

    从高级代码生成 IL 后,你很有可能想要运行它。 CLR 此时将接管工作,启动实时 (JIT) 编译过程,或者将代码从 IL 实时编译成可以真正在 CPU 上运行的机器代码。 这样,CLR 就能确切地知道代码的作用,并可以有效地_管理_代码。

    托管代码互操作性

    当然,CLR 允许越过托管与非托管环境之间的边界,同时,即使在基类库中,也有很多代码可以做到这一点。 这称为互操作性,简称 interop。 例如,使用这些机制可以包装某个非托管库以及调用该库。 但是,请务必注意,如果采取这种方法,当代码越过运行时的边界时,实际的执行管理将再次交接到托管代码,因而需要遵

  • 相关阅读:
    严重: Parse error in application web.xml file at jndi:/localhost/ipws/WEBINF/web.xml java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml
    Failed to install .apk on device 'emulator5554': timeout解决方法
    java.lang.NoClassDefFoundError:org.jsoup.Jsoup
    Conversion to Dalvik format failed: Unable to execute dex:解决方法
    apache Digest: generating secret for digest authentication ...
    Description Resource Path Location Type Project has no default.properties file! Edit the project properties to set one.
    android service随机自启动
    MVC3 安装部署
    EF 4.3 CodeBased 数据迁移演练
    SQL Server 2008开启sa账户
  • 原文地址:https://www.cnblogs.com/tianwen9579/p/10384845.html
Copyright © 2011-2022 走看看