五,.NET的运行机制
  (1).NET程序被编译成什么形式的代码
  .net程序在第一次编译后,形成CLR头,元数据和中间代码。
  在实时运行或者部署时,进行第二次变异,编译的结果是在CLR中可以执行的机器代码;
  -CLR头包含了.net在运行该程序时得到的信息,包括程序集版本号,文件名和模块版本号。
  -MetaData包含了所有类型的定义,所有的引用以及程序集清单。
  (2)JIT是如何工作的
  JIT引擎在编译中间代码之前,会寻找本机机器代码缓存并且确认是否可用:
  -如果可以用,则直接加载;
  -如果不可用,JIT引擎会查找类型中的方法存根,找到中间代码并且进行编译。
  (3)简述程序集的加载机制
  CLR通过System.Reflection.Assembly.LoadFrom和System.Reflection.Assembly.Load来主动加载程序集:
  -前者通过位置加载程序集;
  -后者通过标识强命名程序集的四个元素来标识程序集;
  它们的加载方式一致,其内在策略是依次通过版本策略,CODEBASE位置,应用程序域位置和程序位置来查找程序集。
  (4)如何配置程序集的版本策略
  CLR支持3个级别上设定版本策略,依次是:应用程序策略,发行者策略和计算机策略。
  所有的策略的设置都是通过修改配置文件来实现的。3个级别策略依次会被CLR执行,而上一个策略的执行结果将被作为下一个策略的输入。
  发行者策略仅仅对那些被放入GAC(缓存)的程序集,并且可以再应用程序策略中被忽略。
  既然上面提到程序集了,下面我们来看看什么是程序集。
  六,什么是程序集和应用程序域
  程序集和应用程序域是.NET框架中比较基本的概念,每个.NET程序员都在日常工作中不断地与其打交道。程序集和应用程序域是.NET程序打包和部署的基础,读者需要清楚地理解其基本概念。
  所涉及的知识点
  程序集的基本概念
  应用程序域的基本概念
  分析问题
  首先来解释程序集的概念。程序集(Assembly)是一个或多个模块和资源文件的集合。当一个程序集被打包形成时,它不仅会包含所有的原始文件内容,也会添加一个程序集清单,该清单包含了程序集的版本号、语言、发布者、导入类型等信息。有趣的是,程序集清单可以被添加到程序集中的某个文件之上,编译器也可以为程序集清单单独创建一个文件。
  程序集是一个逻辑上的概念,而不是指一个或几个物理文件或者代码段。
  程序集概念的引入,给系统的设计和部署带来了很大的灵活性。
  (1)程序集支持多编程语言开发,是一个程序集可以包含由不同编程语言定义和实现的模块。在程序集被编译形成时,所有这些类型已经被编译成中间代码,而不再带有原来编程语言的特性。
  (2)程序集允许逻辑分布和物理分布分离。这样虽然同属于一个逻辑程序集,各种类型和资源仍然可以分布在不同的物理文件里。这大大地提高了系统部署的灵活性。例如程序员可以把某个程序集分成四个文件,分别包含基本类型定义、基本HELP文档、可选类型定义和可选HELP文档。这样在部署该系统时,可以让用户选择需要的功能,并且按照用户的选择从服务器下载必要的文件来组成程序集。
  包含了程序集清单的那个文件对使用该程序集来说是必需的。
  接下来看一下应用程序域的概念,同样,这是一个.NET提出的新概念。在操作系统中,一个普通的应用程序通常占据一个操作系统的进程。操作系统的进程为应用程序提供了独立的内存空间,规定了代码的执行范围,并且提供了错误隔离机制。在.NET框架中,应用程序域(AppDomain)提供了和操作系统进程非常类似的功能。一个在CLR中运行的应用程序,将至少拥有一个应用程序域。和操作系统的进程相同,应用程序提供了代码的执行范围,并且为程序提供隔离。在多个应用程序域间通信是非常困难的,每个类型实例都会存放在一个应用程序域内,并且,所有域内的引用必须引用自己所在应用程序域的对象。
  和操作系统的进程不同的是,应用程序域的创建和销毁所需要的开销会相对较小。当然,CLR仍然在操作系统上运行,所以某个应用程序域必定运行在某个操作系统的进程内,在CLR的安排下,每个操作系统的进程也可以包含多个应用程序域。图2.2表示了这种组织结构。
  答案
  程序集(Assembly)是一个由类型定义、数据文件和资源文件组成的逻辑集合。每个程序集都包含一个程序集清单,该清单通常被附加在某个文件头上,也可以设置单独建立一个文件来包含该清单。
  应用程序域是CLR中提供代码运行范围、错误隔离和安全设置隔离的逻辑单元,功能类似于操作系统的进程。一个或多个应用程序域在一个操作系统的进程中运行。应用程序域的创建和销毁所需的开销,相对于操作系统进程较小。但和操作系统进程一样,应用程序域之间的数据共享相当困难。
  现在我们在来看下,程序集的版本分为哪些组成?
  七,程序集的版本分为哪些组成?
  每一程序集都有一个版本号作为其标识的一部分。因此,如果两个程序集具有不同的版本号,运行时会将它们视作完全不同的程序集。此版本号实际表示为具有以下格式的四部分号码:
  <主版本>.<次版本>.<生成号>.<修订号>
  例如,版本1.5.1254.0中的1表示主版本,5表示次版本,1254表示生成号,而0则表示修订号。
  版本号与其他标识信息(包括程序集名称和公钥,以及与该应用程序所连接的其他程序集的关系和标识有关的信息)一起存储在程序集清单中。
  在生成程序集时,开发工具将把每一个被引用程序集的依赖项信息记录在程序集清单中。运行时将这些版本号与管理员、应用程序或发行者设置的配置信息结合使用,以加载被引用程序集的正确版本。
  为进行版本控制,运行时会区分常规程序集和具有强名称的程序集。只对具有强名称的程序集执行版本检查。
  有关指定版本绑定策略的信息,请参见配置文件。有关运行时如何使用版本信息查找特定程序集的信息,请参见运行时如何定位程序集。
  八,什么是托管代码?什么是非托管代码?
  托管代码(managed code)
  由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
  托管代码是可以使用20多种支持Microsoft.NET Framework的高级语言编写的代码,它们包括:C#,J#,Microsoft Visual Basic.NET,Microsoft JScript.NET,以及C++。所有的语言共享统一的类库集合,并能被编码成为中间语言(IL)。运行库编译器(runtime-aware ompiler)在托管执行环境下编译中间语言(IL)使之成为本地可执行的代码,并使用数组边界和索引检查,异常处理,垃圾回收等手段确保类型的安全。
  在托管执行环境中使用托管代码及其编译,可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样,许多不可靠的设计也自动的被增强了安全性,例如类型安全检查,内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用逻辑设计并可以减少代码的编写量。这意味着更短的开发时间和更健壮的程序。
  非托管代码(unmanaged code)
  在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
  问题:什么是托管?托管是什么意思?
  托管代码是基于.net元数据格式的代码,运行于.net平台之上,所有的与操作系统的交换有.net来完成,像是把这些功能委托给.net,所以称之为托管代码。非托管代码则反之。
  举个例子l
  Vc.net还可以使用mfc,atl来编写程序,他们基于MFC或者ATL,而不是.NET,所有是非托管代码,如果基于.net比如C#,VB.net则是托管代码
  非托管代码是指.NET解释不了的
  简单的说,托管代码的话,.net可以自动释放资料,非托管代码需要手动释放资料.
  先整这么多吧,下次接着整理这些。我有什么错误的地方请告诉一下,让我改正过来。谢了。