重庆熊猫 Loading

C#教程 - 程序集(Assembly)

更新记录
转载请注明出处:
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

​ 中间代码

元数据

​ 类型说明信息

资源

​ 资源是可选的

示意图:
image

多文件程序集结构

大部分程序集由单文件组成,但也有多个文件的

程序集的代码文件称为模块, 对于有多个模块的程序集,一个文件是主模块(primary module),其他文件是次要模块(secondary modules)

主模块包含有程序集的清单和到次要模块的引用

次要模块文件名以.netmodule结尾

多文件程序集被视为单一单元,需要一起部署并一起定版本
image

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操作步骤

添加项目引用
image

在代码中添加using可以减少写命名空间的次数(可选)

编译过程示意图

image

友好程序集(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中
image

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

命名冲突问题

当引入两个程序集类库,而这两个程序类库中同时都声明了一个相同的类型,会产生命名冲突问题
image

解决的办法就是使用命名空间:
image

程序集标识符

在.NET中,程序集的文件名不像其他操作系统中那么重要,更重要的是程序集的标识符(identity)

程序集标识符组成:

​ 简单名:就是程序集文件的文件名(不带扩展名)

​ 版本号:4个句点分开的整数字符串组成,MajorVersion.MinorVersion.Bulid.Revision

​ 文化信息:一个字符串(2~5个字符),代表一个语言或地区,比如每个en-US

​ 公钥:128字节字符串,表示这是一个独一无二的程序集

清单中程序集标识符的组成图示
image

完全限定名称概念:
image

强命名程序集

说明

强命名(strong named)程序集有一个唯一的数字签名,强命名程序集比没有强命名的程序集更加安全
image

使用visual studio生成强命名程序集

进入项目属性页
image

为程序集添加签名
image

使用Strong Name(sn.exe)

Strong Name工具是个命令行工具,允许手动为程序集签名,比使用Visual Studio签名更加高级拥有更多选项

首先先用sn工具生成一对秘钥:sn -k 秘钥名.snk
image

然后在程序集的属性文件中添加KeyFile

注意:一定要添加版本号,版本号也是秘钥的一部分
image

设置程序集的信息

方法一:项目属性窗口中的程序集信息设置

image

方法二:AssemblyInfo.cs文件

image

程序集部署

私有方式部署

直接复制程序集文件到目标机器即可,也称为复制文件(XCopy)部署

提示:

私有程序集的所在的目录被称为应用程序目录

私有程序集可以是强命名的也可以是弱命名的

不需要再注册表中注册组件

卸载一个私有程序集直接删除程序集的文件即可

共享程序集和GAC

将程序集放在全局程序缓存(GAC)目录下,所有.NET程序都可以使用

这种程序集叫做共享程序集

只有强命名的程序集支持添加到GAC

.NET4.0版本之后的GAC目录:C:\Windows\Microsoft.NET\assembly

.NET4.0版本之前的GAC目录:C:\Windows\assembly

注意:只有.dll文件才能部署为共享程序集

把程序集安装到GAC的办法:

​ 首先程序集必须是强命名的(在安装时进行检查,使用时不检查)

​ 使用gacutil.exe从GAC添加或删除程序集

image

进入待安装的程序集目录,然后执行安装命令
image

卸载只是命令参数换一下
image

posted @ 2022-09-21 08:30  重庆熊猫  阅读(2929)  评论(0编辑  收藏  举报