更新记录
转载请注明出处:
2022年9月21日 发布。
2022年9月10日 从笔记迁移到博客。
程序集(Assembly)说明
运行在CLR上的版本化的、自描述的二进制文件
An assembly may be static (based on a file) or dynamic (created in memory)
程序集作用
代码可以放在多个程序集中实现代码重用
限定代码的作用范围(程序集.命名空间.类型名)
程序集具有版本,可以实现代码版本化管理
程序集是自描述的
程序集是可配置的,私有或公有,都可以使用XML文件
程序集文件表现
程序集外在表现可以分为:application(应用)、library(类库)
它们的区别在于:application包含mian方法,而library不包含
library常用于被applicaiton或其他library调用
目标类型:
/Target:exe
/Target:winexe
/Target:library
/Target:module
程序集的外在文件扩展名表现:
.dll
.exe
注意:程序集是一个逻辑概念,可以跨越多个物理文件
.NET Framework程序集存放位置
%SystemRoot%\Assembly
程序集结构组成
说明
程序集不包含本地机器代码,而是包含:
中间语言代码(IL code、Type metadata)
即时编译器(JIT)
将CIL转为本地代码的一切,比如:引用其他程序集的引用(Assembly metadata and manifest)
Embedded Resources (optional): Images, strings, JavaScript, and so on
结构组成
Windows文件首部
作用:可以让windows操作系统加载程序集
CLR文件首部
清单
程序集标识(如:名称,版本,文化信息,公钥)
组成程序集的文件列表
引用其他程序集信息
类型的程序集位置索引
CIL
中间代码
元数据
类型说明信息
资源
资源是可选的
示意图:
多文件程序集结构
大部分程序集由单文件组成,但也有多个文件的
程序集的代码文件称为模块, 对于有多个模块的程序集,一个文件是主模块(primary module),其他文件是次要模块(secondary modules)
主模块包含有程序集的清单和到次要模块的引用
次要模块文件名以.netmodule结尾
多文件程序集被视为单一单元,需要一起部署并一起定版本
metadata(元数据)
The metadata includes the following items:
A description of each type within a program or class library
The manifest information containing data about the program itself,along with the libraries it depends on
Custom attributes embedded in the code, providing additional information about the constructs the attributes decorate
引用其他程序集(Reference Assembly)
Visual Studio操作步骤
添加项目引用
在代码中添加using可以减少写命名空间的次数(可选)
编译过程示意图
友好程序集(Friend Assemblies)
可以将一个程序集标记为自己的友好程序集
实例:使用特性即可
[assembly: InternalsVisibleTo ("FriendName")]
实例:friend assembly has a strong name
[assembly: InternalsVisibleTo("StrongFriendName, PublicKey=0024f000048c...")]
实例:提取当前程序集的公钥
string key = string.Join ("",
Assembly.GetExecutingAssembly().GetName().GetPublicKey()
.Select (b => b.ToString ("x2")));
mscorelib.dll
程序集mscorelib.dll包含C#基本类型和大部分.NET语言基本类型的定义
在编译C#程序时,它总是被引用,所以它并不会显示在References中
CoreLib.dll
类似.NET Framework中的mscorelib.dll程序集
大部分.NET Core基本的基本类型都放在System.Private.CoreLib.dll程序集中
System.Private.CoreLib.dll 约等于 .NET Framework中的 mscorlib.dll
包括内置类型以及基本的集合类,以及流处理、序列化、反射、线程和本机互操作性的类型
注意:System.Private.CoreLib.dll 已经代替了 .NET Framework中的 mscorlib.dll
命名冲突问题
当引入两个程序集类库,而这两个程序类库中同时都声明了一个相同的类型,会产生命名冲突问题
解决的办法就是使用命名空间:
程序集标识符
在.NET中,程序集的文件名不像其他操作系统中那么重要,更重要的是程序集的标识符(identity)
程序集标识符组成:
简单名:就是程序集文件的文件名(不带扩展名)
版本号:4个句点分开的整数字符串组成,MajorVersion.MinorVersion.Bulid.Revision
文化信息:一个字符串(2~5个字符),代表一个语言或地区,比如每个en-US
公钥:128字节字符串,表示这是一个独一无二的程序集
清单中程序集标识符的组成图示
完全限定名称概念:
强命名程序集
说明
强命名(strong named)程序集有一个唯一的数字签名,强命名程序集比没有强命名的程序集更加安全
使用visual studio生成强命名程序集
进入项目属性页
为程序集添加签名
使用Strong Name(sn.exe)
Strong Name工具是个命令行工具,允许手动为程序集签名,比使用Visual Studio签名更加高级拥有更多选项
首先先用sn工具生成一对秘钥:sn -k 秘钥名.snk
然后在程序集的属性文件中添加KeyFile
注意:一定要添加版本号,版本号也是秘钥的一部分
设置程序集的信息
方法一:项目属性窗口中的程序集信息设置
方法二:AssemblyInfo.cs文件
程序集部署
私有方式部署
直接复制程序集文件到目标机器即可,也称为复制文件(XCopy)部署
提示:
私有程序集的所在的目录被称为应用程序目录
私有程序集可以是强命名的也可以是弱命名的
不需要再注册表中注册组件
卸载一个私有程序集直接删除程序集的文件即可
共享程序集和GAC
将程序集放在全局程序缓存(GAC)目录下,所有.NET程序都可以使用
这种程序集叫做共享程序集
只有强命名的程序集支持添加到GAC
.NET4.0版本之后的GAC目录:C:\Windows\Microsoft.NET\assembly
.NET4.0版本之前的GAC目录:C:\Windows\assembly
注意:只有.dll文件才能部署为共享程序集
把程序集安装到GAC的办法:
首先程序集必须是强命名的(在安装时进行检查,使用时不检查)
使用gacutil.exe从GAC添加或删除程序集
进入待安装的程序集目录,然后执行安装命令
卸载只是命令参数换一下