文本脉络图如下:

一、源代码-面向CLR的编译器-托管模块-(元数据&IL代码)中介绍了编译器将源文件编译成托管模块(中间语言和元数据),本文主要介绍如何将托管模块合并成程序集.

1、程序集的基本概念

2、程序集生成的过程

注:

(1)、清单指出程序集只有一个文件组成

(2)、对于只有一个托管模块,没有资源文件的项目,程序集就是托管模块.

(3)、如果需要将一组文件合并到程序集中可以使用程序集链接器(AL.exe)以及其他的一些命令行选项.

3、如何构建可重用、可版本控制、可保护的组件.

常用的方法是,把程序集的物理表示和逻辑表示区分开,将很少用到的类型和文件放到单独的文件中,并将这些文件作为程序集的一部分,如果运行时需要,则去下载,这样不仅节省了磁盘空间,还节省了安装时间.通过程序集,可以在不同的地方部署,同时任然将所有的文件当作一个整体来看待.

4、关于程序集自描述的优点

在程序集的模块中,还包含与引用的程序集有关的信息(版本号、描述等等),具体如下图

 

这些信息(当然远不止上图中的这点信息)使程序集能够自描述.也就是说CLR能判断为了执行程序集中的代码,程序集的直接依赖对象是什么.不需要在注册表或者Active Directory Domain Services(ADDS)中注册额外的信息.由于无需额外的信息,所以和非托管组件相比,程序集更容易部署.

5、将模块合并成程序集

程序集构成简介:

一、源代码-面向CLR的编译器-托管模块-(元数据&IL代码)中介绍了C#源码通过编译器最终生成托管模块,而托管模块是标准的32位Microsoft Windows可移植执行体(PE32)文件或者标准的64位Microsoft Windows可移植执行体(PE32+)文件。

而exe文件并不是只含有元数据的PE文件,它还是程序集.程序集是一个或多个类型定义文件及资源文件的集合,

程序集清单文件简介:

在程序集的所有文件中二、源代码=>程序集及程序集概念介绍,有一个文件容纳了清单.清单也是一个元数据表集合(关于元数据表请参考十、元数据概述),表中主要包含作为程序集组成部分的那些文件的名称,除此之外,还描述了程序集的版本、语言文化、发布者、公开导出的类型以及构成程序集的所有文件.

CLR操作的是程序集,CLR总是先加载"清单"中的数据,在根据"清单"中的数据来获取程序集中其他文件的名称.以下是程序集的重要特点

(1)、程序集定义了可重用的类型

(2)、程序集用一个版本号标记

(3)、程序集可以关联安全信息

除了包含清单元数据表的文件,程序集其他的单独文件并不具备上述特点.

类型为了进行顺利的打包、版本控制、安全保护以及使用,必须放在作为程序集一部分的模块中,程序集大多时候只有一个文件,就像前面的Program.exe文件那样,然而,程序集还可由多个文件构成,一些文件是含有元数据的PE文件,另一些是.gif文件或.jpg这样的文件,为了便于理解,可将程序集看作一个逻辑EXE或DLL.

6、Microsoft引入程序集的的原因

使用程序集将可重用类型的逻辑表示与物理表示区分开,例如,程序集可能包含多个类型,可以将常用类型放到一个文件中,不常用类型放到另一个文件中.如果程序集需要从Internet下载并部署,那么对于含有不常用类型的文件,假如客户端永远不使用那些类型,该文件就永远不会下载到客户端.

7、配置应用程序下载程序集文件

为了配置应用程序去下载程序集文件,可在应用程序配置文件中指定codeBase元素,在codeBase元素定义的URL所指向的位置,可找到程序集的所有文件.

应用程序下载程序集的过程如下:

(1)、CLR获取codeBase元素的URL

(2)、检查机器的下载缓存,判断文件是否存在.如果是,直接加载文件.如果不是,CLR去URL指向的位置将文件下载到缓存.

(3)、如果找不到文件,CLR在运行时抛出FileNotFoundException异常.

8、使用多文件程序集的三点理由

(1)、不同的类型用不同的文件,是文件能以"增量"方式下载(如Internet下载方式).另外,将类型划分到不同的文件中,可以对购买和安装的应用程序进行部分或分批打包/部署.

(2)、可在程序集中添加资源或数据文件.

例如,假定一个类型的作用是计算保险信息,需要访问精算表才能完成计算,这种情况下,不必在自己的源代码中嵌入精算表,相反,可以使用一个工具(比如稍后要讨论的程序集链接器AL.exe),是数据文件成为程序集的一部分.顺便说一句,数据文件可以为任意格式,只要应用程序知道如何解析即可.

(3)、程序集包含的各个类型可以用不同的编程语言来实现.例如,一些类型可以用C#实现,一些用VB来实现,其他则用其他语言来实现,编译用C#写的类型是,编译器会生成一个一个模块,编译用VB写的类型时,编译器也会生成另一个模块,然后使用工具将所有的模块合并成一个程序集.

好处:这样其他开发人员只知道这个程序集包含了一系列的类型信息,根本不知道、也不用知道这些类型分别是用什么语言编写的.当然可以使用ILDasm.exe获得相应的IL源代码文件。然后运行ILAsm.exe.将所有的

9、将模块还原成单个文件

(1)、对每个模块都运行ILDasm.exe,获得相应的IL源代码文件.

(2)、运行ILAsm.exe,将所有的IL源代码文件传给它.随后,ILAsm.exe会生成包含类型的单个文件.

前提:生成的IL代码足够干净.

10、关于程序集必知的重点

(1)、程序集是进行重用、版本控制和应用安全性设置的基本单元。它允许将类型

 
 

二、源代码=>程序集及程序集概念介绍的更多相关文章

  1. 【官方文档】Nginx负载均衡学习笔记(二)负载均衡基本概念介绍

    简介 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务.负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应 ...

  2. C#程序集及程序集概念介绍

    一.源代码-面向CLR的编译器-托管模块-(元数据&IL代码)中介绍了编译器将源文件编译成托管模块(中间语言和元数据),本文主要介绍如何将托管模块合并成程序集. 1.程序集的基本概念 2.程序 ...

  3. java 并发多线程 锁的分类概念介绍 多线程下篇(二)

    接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概念,也是一种简单粗暴的解决方案 抗战电影中,经常出现为了阻止日 ...

  4. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)

    集群概念介绍(一)) 白宁超 2015年7月16日 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习 ...

  5. Linux LVM硬盘管理之一:概念介绍

    一.LVM概念介绍: LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现.LVM将一个或多个硬盘的分区在逻 ...

  6. spring batch (一) 常见的基本的概念介绍

    SpringBatch的基本概念介绍 内容来自<Spring Batch 批处理框架>,作者:刘相. 一.配置文件 在项目中使用spring batch 需要在配置文件中声明: 事务管理器 ...

  7. Maven学习 一 概念介绍

    一 Maven是什么 Maven是一个Apache公司的开源项目,主要有两个作用:(1)是项目构建工具.(2)是用来管理java程序中jar包的依赖. 它包含了一个项目对象模型(Project Obj ...

  8. MPP、SMP、NUMA概念介绍

    一.MPP,SMP,NUMA概念介绍 1.1.       MPP架构介绍 MPP (Massively Parallel Processing),大规模并行处理系统,这样的系统是由许多松耦合的处理单 ...

  9. 转载:【Oracle 集群】RAC知识图文详细教程(一)--集群概念介绍

    文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...

随机推荐

  1. 字典树Java实现

    Trie树的原理 Trie树也称字典树,因为其效率很高,所以在在字符串查找.前缀匹配等中应用很广泛,其高效率是以空间为代价的. 利用串构建一个字典树,这个字典树保存了串的公共前缀信息,因此可以降低查询 ...

  2. Java源码更改的方式

    1.找到要改的类所在包名地址. 比如标签名的更改: <s:debug></s:debug> (1)ctril+鼠标左键========双击标签,就会弹出标签所在的类的文本 (2 ...

  3. org.eclipse.ui.PartInitException: Unable to open editor, unknown editor ID: org.xmen.ui.text.XMLTextEditor

    无法打开struts模式的编译xml的编译器,然后打开.project文件,编辑最后一行,找到<natures>结点,增加一条<nature>com.genuitec.ecli ...

  4. MemCache 安全使用原则(自己整理,仅供参考)

    // 触发器:作用是检查缓存时否可用(不用add做触发器),避免缓存不可用时add返回false按非首次登陆处理,导致不能增加成长值. memCachedClient.get(memCacheKey) ...

  5. 用Node完成AWS S3的Upload流程之全世界最简版

    开场: 查了两天文档,Error了38次,最后索性去掉所有附加条件, 连界面也不要了,在命令行里跑通了一坨最干瘪的Upload流程! 还冒着热气…… 在此先做记录,明天可以搭配美美的界面继续调试了. ...

  6. ( KMP 求循环节的个数)Power Strings -- poj -- 2406

    链接: http://poj.org/problem?id=2406 Power Strings Time Limit:3000MS     Memory Limit:65536KB     64bi ...

  7. iterm2 学习笔记

    itrem 笔记 选中即复制,有两种方式. 在新Tab中自动使用前一Tab路径,该怎么用? 系统热键:option+space 自动完成:输入打头几个字母,然后输入command+“;” iterm2 ...

  8. VCL消息处理机制

    http://www.cnblogs.com/railgunman/archive/2010/12/10/1902524.html#2868236 说到VCL中的消息处理就不能不提到TApplicat ...

  9. supervisor配置环境变量(PATH)

    app配置中增加: environment=PATH="/PATH/TO/anaconda3/bin" supervisord在linux中启动默认继承了linux的环境变量,在这 ...

  10. 单线程任务 Task.Factory.StartNew 封装

    代码: using log4net; using SunCreate.CombatPlatform.Security; using System; using System.Collections.G ...