CLR执行模式之托管代码程序集浅析

CLR即公共语言运行时,是一个可由多种编程语言使用的‘运行时’,其核心功能(内存管理,程序集加载,安全性,异常处理和线程同步等)均可由面向CLR的所有语言使用。运行时不必关心开发人员用哪一种语言写源代码,只要编译器是面向CLR的。

通过语言对应的编译器检查语法和分析源码编译生成某些托管模块(PE32或PE32+)通过数据执行保护(DEP)和地址空间布局随机化(ASLR)增强整个系统的安全性。接下来详说其主要组成部分:

  • PE32或PE32+:标准Windows PE文件头(一种格式),使用PE32格式文件能在Win32位或64位版本上运行,使用PE32+只能在64位上运行。其标识了文件类型对于只包含IL代码的模块PE32(+)头的大多数信息会被忽视,如果包含本机CPU代码的模块,这个头包含与本机CPU代码有关的信息。
  • CLR头:包含是这个模块成为托管模块的信息(要求的CLR版本,一些标志,托管模块入口方法的元数据以及模块的元数据,资源强名称,一些标志及其他不太重要的数据项的位置)
  • 元数据:每个托管模块都包含元数据表。主要有两种,一种描述源代码中定义的类型和成员,另一种描述源代码引用的类型和成员。
  • IL(中间语言)代码:编译器编译源代码时生成的代码,在运行时将IL编译成本机CPU指令。

简单来说一种格式标准让其成为一种模块,模块中元数据其实就是数据表的集合,用以关联IL代码文件可以说是同步的。

元数据的加入有许多用途:

  • 编译器直接从托管模块读取元数据,避免对原生C/C++头和库文件的需求。
  • 帮助你写代码(智能感知技术)
  • CLR代码验证过程使用元数据确保代码只执行“类型安全”的操作。
  • 允许将对象的字段序列化到内存块,将其发送给另一台机器,然后反序列化在远程机器上重建对象状态
  • 垃圾回收器的实现

CLR其实不和模块工作,通常将一个或多个模块/资源文件逻辑性分组成程序集(抽象概念,是重用,安全性以及版本控制的最小单元,相当于组件)。编译器默认将生成的托管模块转换成程序集,C#编译器生成的是含有清单的托管模块,清单指出程序集只由一个文件构成。所以对于只有一个托管模块且无资源文件的项目,程序集就是托管模块。在程序集的模块中,包含于引用的程序集有关的信息,这些信息使程序集能够自描述(C#通过元数据来描述自身,当执行代码时,运行库将元数据加载到内存,并引用他来发现有关代码的类成员等信息)。程序集吧逻辑表示与物理表示区分开,便于部署文件节省空间缩短安装时间。

时间: 2024-12-17 15:35:33

CLR执行模式之托管代码程序集浅析的相关文章

CLR执行模式之程序集代码的执行

所知IL是与CPU无关的机器语言,其能访问和操作对象类型,并提供指令来创建和初始化对象,调用对象上的虚方法以及直接操作数组对象等,故可视为一种面向对象的机器语言.每种语言的存在都有其存在的价值和原因,同时各自有各自的优势,由于CLR的独特性,可以尝试用不同语言描述不同功能(必须是面向CLR的编译器语言). 在方法执行时,需把方法的IL转换成本机CPU指令,这是JIT编译器的职责.一个方法首次调用时: CLR在Main方法执行之前会检测其代码所引用的所有类型,并分配一个内部数据结构来管理对引用类型

CLR执行模型

1:首先先明确CLR的概念: 1:首先先明确CLR的概念:  CLR(Common Language Runtime):公共语言运行时,是一个可由多种编程语言使用的"运行时"; 在运行时,CLR根本不关心开发人员用的是哪一种语言来变写代码,它只关注语言是否是面向CLR(面向运行时)的. 2:CLR的核心功能包括: 内存管理.程序集加载.安全性.异常处理和线程同步. 3:如图: 无论是用的是哪一种编译器,结果都是一个托管模块(managed module),托管代码时一个标准的32位/6

C#程序集系列13,如何让CLR选择不同版本的程序集

本篇主要体验,在存在多个版本程序集的情况下,如何让CLR选择哪个版本程序集运行,以及程序集版本的切换. 分别生成非强名称程序集不同版本 □ 生成某个版本的程序集 →清理F盘as文件夹,剩下如下文件 →查看Cow.cs文件 using System; using System.Reflection; [assembly: AssemblyVersion("3.3.3.3")] public class Cow { public static void Moo() { Console.Wr

处理器执行模式+进程切换

大多数处理器至少支持两种执行模式.某些指令只能在特权模式下执行,包括读取或者改变诸如程序状态字之类控制寄存器的指令.原始IO指令和内存管理相关的指令.另外,有一部分内存区域仅在特权下可以被访问到. 非特权态常被称为用户态,这是因为用户程序通常在该模式下执行:特权态可称作系统态.控制态或者内核态,内核态指的是操作系统的内核,这是操作系统中包含重要系统功能的部分. 这样产生了两个问题:处理器如何知道它正在什么模式下执行以及如何改变这一模式.对第一个问题,程序状态字中有一个位表示执行模式,这一位应某些

回溯法-01背包问题之二:顺序执行模式

上文已讲述了回溯法以及01背包问题的原理,本文讲述如何顺序执行解决01背包问题以及通过模板模式重构软件. 一.顺序执行流程图 图1无剪枝函数的01背包问题顺序执行算法流程图 图2 有剪枝函数的01背包问题顺序执行算法流程图 无剪枝函数是通用的深度遍历算法,为了减少搜索深度可通过剪枝函数处理完全不可能的分枝.与递归方案的区别主要表现在i>=n后需要"回溯",即用后进先出的方式将物品逐个拿出. 二.执行代码 递归与顺序执行方法仅仅是实现方法Backtracking(int i)不同,

【Nutch基础教程之七】Nutch的2种执行模式:local及deploy

在对nutch源码执行ant runtime后,会创建一个runtime的文件夹.在runtime文件夹下有deploy和local 2个文件夹. [[email protected] runtime]$ ls deploy  local 这2个文件夹分别代表nutch的2种执行方式:部署模式及本地模式. 1.nutch.sh中关于2种执行方式的执行 if $local; then # fix for the external Xerces lib issue with SAXParserFac

python之fabric(二):执行模式(转)

执行模式 执行模式可以让你在多个主机上执行多个任务. 执行策略: 默认fabric是单个有序地执行方法,其行为如下: 1. 创建一系列任务,通过fab任务执行要执行的任务: 2. 根据主机列表定义,去执行每一个任务: 3. 没有主机定义的任务,将在本地执行一次. 如: from fabric.api import run, env env.hosts = ['host1', 'host2'] def taskA(): run('ls') def taskB(): run('whoami') #

nVidia GPGPU vs AMD Radeon HD Graphics执行模式对比

大家做高性能计算的朋友,想必对CPU的执行模式已经非常熟悉了吧.当代高级些的CPU一般采用超标量流水线,使得毗邻几条相互独立的指令能够并行执行——这称为指令集并行(ILP,Instruction-Level Parallelism):而像x86引入的SSE(Streaming SIMD Extension).AVX(Advanced Vector Extension),以及ARM的NEON技术都属于数据级并行(Data-Level Parallelism).而GPGPU的执行与CPU比起来还是有

Tomcat Connector三种执行模式(BIO, NIO, APR)的比較和优化

Tomcat Connector的三种不同的执行模式性能相差非常大,有人測试过的结果例如以下: 这三种模式的不同之处例如以下: BIO: 一个线程处理一个请求.缺点:并发量高时,线程数较多,浪费资源. Tomcat7或下面,在Linux系统中默认使用这样的方式. NIO: 利用Java的异步IO处理.能够通过少量的线程处理大量的请求. Tomcat8在Linux系统中默认使用这样的方式. Tomcat7必须改动Connector配置来启动: <Connector port="8080&qu