一、程序集的一些基本概念:
程序集是包含一个或多个类型定义文件和资源文件的集合。它允许我们分离可重用类型的逻辑表示和物理表示。
程序集是一个可重用、可实施版本策略和安全策略的单元。它允许我们将类型和资源划分到不同的文件中,这样程序集的使用者便可以决定将哪些文件打包在一起部署。一旦CLR加载了程序集中包含清单的那个文件,它就可以确定程序集的其他文件中哪些包含了程序正在引用的类型和资源。任何程序集的使用者仅需要知道包含清单的文件名称。文件的划分对使用者是透明的,并且可以在将来改变,同时又不会破坏现有应用程序的行为。
程序集的特性:
1、 程序集定义了可重用的类型。
2、 程序集标识有一个版本号。
3、 程序集可以包含与之相关的安全信息。
二、多文件集:
使用多文件集的三个原因:
1、 可以将类型分别实现在不同的文件中,从而允许文件在互联网环境中进行增量下载。
2、 可以按需要向程序集中添加资源或数据文件。(数据文件可以是任何格式:文本文件、Excel电子表格、Word表格、或者任何我们喜欢的格式)。
3、 可以使我们创建的程序集包含一些用不同编程语言实现的类型。
注意:Visual Studio .NET集成开发环境(Integrated development environment,简称IDE)本身不支持创建多文件程序集,如果需要创建多文件程序集,必须求助于命令行工具。
两个源代码文件:Rut.cs (包含很少使用的类型)Fut.cs (包含经常使用的类型)

csc /t:module Rut.cs //生成Rut.netmodule文件

csc /out:UnionType.dll /t:library /addmodule Rut.netmodule Fut.cs
//生成UnionType.dll类库文件 Run.netmodule文件作为程序集的一部分来对待

三、程序链接器:
程序链接器:Assembly Linker 即AL.exe
1、使用前提:
如果我们要创建的程序集包含来自不同编译器生成的模块,而使用的编译器又不支持类似于C#中/addmodule那样的命令行开关,或者生成模块时还不知道程序集的打包需求,这时程序集链接器就显得非常有用。
2、使用实例:
csc /t:module Rut.cs
csc /t:module Fut.cs
al /out: UnionType.dll /t:library Fut.netmodule Rut.netmodule
四、资源文件的添加
1.使用csc.exe来添加资源文件:
/resource 将把指定的资源文件嵌入到产生的程序集PE文件中,并更新ManifestResourceDef表中的内容。
/linkresource 将向ManifestResourceDef和FileDef清单表中添加一条目,使其指向一个单独的资源文件。
2.使用AL.exe来添加资源文件:
/embed[resource]:该命令行接受任何类型的文件,将其内容嵌入到产生的PE文件中。同时,清单中的ManifestResourceDef表将被更新以反映该资源的存在。
/link[resource]:该命令将只更新清单中的ManifestResourceDef表和FileDef表,以反映资源的存在,并标识出程序集的哪个文件包含着资源文件。资源文件本身不会被嵌入到程序集PE文件中,它仍然保持独立,并且须和其它程序一起打包、部署。
3.将Win32资源嵌入到程序集中:
通过AL.exe或csc.exe添加/win32res命令行开关指定一个.res文件路径来实现。
通过AL.exe或csc.exe添加/win32icon命令行开关并指定一个.ico文件路径来实现。
五、程序集版本信息:
版本号由四个部分组成:主版本号、次版本号、生成版本号、修订版本号
例:2.5.719.2 主版本号与次版本号组成“面向公众”的版本部分,第三个版本号719表示程序集的生成版本,最后一个版本号2表示对生成版本的修订版本。
一个程序集的三个相关版本号:
1、 AssemblyFileVersion: 该版本号存储在Win32版本资源中,它仅仅是一个辅助性的信息。
2、 AssemblyInformationalVersionAttribute:该版本号也存储在Win32版本资源中,仅辅助性作用。
3、 AssemblyVersion:该版本号存储在AssemblyDef清单元数据表中。这个版本号非常重要,它用来惟一地标识一个程序集。
六、语言文化:
不提倡创建包含代码的卫星程序集,但还是有可能做到。如果我们愿意,仍然可以用System.Reflection.AssemblyCultureAttribute定制特性来代替AL.exe的/culture命令行开关来指定语言文化。示例如下:
//将程序集的语言文化设置为瑞士德语
[assembly :AssemblyCulture (“de-CH”)]
通常情况下,我们创建的程序集不应该引用卫星程序集。也就是一个程序集的AssemblyRef条目指向的都应该是语言文化中性的程序集。如果想访问一个卫星程序集中的类型或成员,我们应该使用反射技巧。
卫星程序集:标识着特定语言文件的程序集称为卫星程序集。
七、共享程序集:
1..NET框架支持的两种程序集:
弱命名程序集:Weakly named assembly
强命名程序集:Strongly named assembly
二者之间的真正区别在于:强命名程序集有一个发布者的公钥/私钥对签名,其中的公钥/私钥匙对惟一地标识了程序集的发布者。
强命名集包含四个惟一标识程序集的特性:文件名(没有扩展名)、版本号、语言文化标识和一个公有密钥标识。
例:”MyTypes,Version=1.0.8123.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”
2.强命名实用工具:
Strong Name Utility即SN.exe 和.Net框架SDK,以及Visual studio .Net一起发布的一个工具。
例:SN –k MyCompany.keys
该命令告诉SN.exe创建一个名为Mycompany.keys的文件。Mycompany.keys文件将包含一对以二进制格式存储的公有密钥和私有密钥。
查看公有密钥:(必须执行下面两步)
SN –p MyCompany.keys MyCompany.publickey
SN –tp MyCompany.publickey
创建强命名程序集:
[assembly: AssemblykeyFile ( “MyCompany.keys”)]
3.程序集的两种部署方式:即私有部署方式和全局部署方式
私有部署方式将程序集部署在应用程序的基目录及其子目录下,弱命名程序集只能进行私有部署。
全局部署方式将程序集部署在一些CLR确知的地方。强命名程序集既可以进行私有部署,也可以进行全局部署。
4.System.Reflection.AssemblyName类:
利用它,我们可以很容易地创建一个程序集名称,并获取一个程序集名称的各个部分。公有实例属性:如CultureInfo、FullName、KeyPair、Name以及Version.该类提供了几个公有实例方法,如GetPublicKey、GetPublicKeyToken、SetPublicKey、以及SetPublicKeyToken。
八、其他
元数据标识是一个4字节的数值,其高位字节表示标记的类型(0x01 = TypeRef ,0x02 =TypeDef, 0x26 = FileDef , 0x27 = ExportedType)
为使我们创建的程序集出现在.NET选项卡的列表中,可以将下面的子键添加到注册表中:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/
- 【C#基础概念】程序集与托管模块的概念
本文是为了学习程序集而整理的网上资料,主要包括两个部分,概念和使用,前部分讲怎样理解程序集,后部分讲述怎样使用的细节. 程序集与托管模块的概念 "程序集与托管代码块"(摘自Hima ...
- 【C#基础概念】程序集Assembliy
一. 程序集定义 二. 程序集结构 通常,静态程序集可能由以下四个元素组成: 程序集清单(manifest) 类型元数据metadata和程序集元数据. 实现这些类型的 Micro ...
- NET基础课--NET中程序集0-1
程序集 1.表现形式:.dll 和. exe . 2.程序集组成:PE头,CLR头,清单,元数据,CIL代码,资源文件.实际上这些内容包含在一个叫做Module的逻辑结构中. 单模块程序集:程序集就 ...
- 全面认识.NET框架(一)
重新学习下.NET框架,在这里将会对.net框架逐步的学.加深一下对.net的认识.如果那个地方有错误,希望大家能够指出来.谢谢. 知识有限,先逐步了解下.net包含的什么.我就是写写我目前想了解的内 ...
- C#高级
程序集 程序集概念: 程序集是.net中的概念. .net中的dll与exe文件都是程序集.(exe与dll的区别(exe有程序主入口,可以执行,dll没有主入口,不可运行)) 程序集(Assembl ...
- C#语言基础原理及优缺点
一.原理: C#是专门为.net程序框架而创造的语言. .net框架有ms的.netFramework:Mono的.NetFramework(也是符合.net IL语言,CTS规范,CLS规范, CL ...
- NET那点不为人知的事
ASP.NET那点不为人知的事(一) 我们上网时,在浏览器地址输入网址:Http://www.cnblogs.com,按下回车,一张网页就呈现在我们眼前.这究竟发生了什么?对于一名优秀的Progr ...
- 程序集和反射(C#)
这里我又唠叨几句,大家在学习的时候,如看书或者看视频时觉得非常爽,因为感觉基本都看得懂也都挺容易的,其实看懂是一回事,你自己会动手做出来是一回事,自己能够说出来又是另一回事了.应该把学到的东西变成自己 ...
- 通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
什么是.NET?什么是.NET Framework?本文将从上往下,循序渐进的介绍一系列相关.NET的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念,这主要包 ...
随机推荐
- php操作xml
最近计划写个人的小网站,一系列原因选择了用php来写,最大的问题就是虽然php很流行,但我从来没有接触过php,看了一个多星期的基本语法后做些小练习热热身,但是期间是各种问题啊,主要是对php不熟悉, ...
- NanoProfiler - 适合生产环境的性能监控类库 之 基本功能篇
背景 NanoProfiler是一个EF Learning Labs出品的免费性能监控类库(即将开源).它的思想和使用方式类似于MiniProfiler的.但是,设计理念有较大差异. MiniProf ...
- [HIMCM暑期班]第4课: 扑克牌问题
假设跟你玩这样一个游戏: 拿一副52张牌的扑克,洗均匀.每次展示一张牌,如果是红心或者方块,你就赢10块钱:如果是黑桃或者草花,你就输10块钱.你可以选择在任何时候终止此游戏.问如何确保利益最大化? ...
- python Web开发框架-Django (2)
接上篇文章,介绍一些实用的技巧和注意点.首次用MarkDown编辑,感觉行空隙太大,不是那么好看. GET/POST 前后端会有数据交互,使用JQuery来实现get/post请求 GET 方法1:通 ...
- atitit.vod search doc.doc 点播系统搜索功能设计文档
atitit.vod search doc.doc 点播系统搜索功能设计文档 按键的enter事件1 Left rig事件1 Up down事件2 key_events.key_search = fu ...
- 每天一个linux命令(11):nl命令
nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...
- web工作流
web工作流之Gulp学习 Gulp.js 是一个自动化构建工具,开发者可以使用它在项目开发过程中自动执行常见任务. Gulp.js 是基于 Node.js 构建的,利用 Node.js 流的威力,你 ...
- 处于同一个域中的两台Sql server 实例无法连接
处于同一个域中的两台Sql server 实例无法连接,报的错误信息如下: A network-related or instance-specific error occurred while es ...
- 真正的mybatis_redis二级缓存
网上流传的代码缓存失效存在严重问题. 思路....以后再细说 目前的方案还不够完美,失效力度控制不够细. 主要代码 import java.io.BufferedReader; import java ...
- 深入理解CSS计数器
× 目录 [1]创建计数器 [2]使用计数器 [3]DEMO 前面的话 我们对计数器已经不陌生了,有序列表中的列表项标志就是计数器. 创建计数器 创建计数器的基础包括两个方面,一是能重置计数器的起点, ...