《Illustrated C# 2012, 4th Edition》Daniel M. Solis 第21章 命名空间和程序集 笔记
C#编译器编译源代码生成程序集,不论是.dll还是.exe都是程序集,.dll又称为类库。
要使用其他程序集,需要先在编译器中引用。
mscorlib库包含Console类,它总是被引用,VS不把它放在引用列表中。
命名空间是解决类库之间类名冲突的方案。
命名空间可以通过点号,划分成多个层次。
不同源文件,甚至不同程序集中都可以声明相同的命名空间,只要命名空间的成员不重名。
命名空间支持嵌套:
注意:即使嵌套,命名空间之间还是独立,仅using父命名空间,并不能直接访问子命名空间的成员。
using命名空间指令必须放在任何声明之前。
using别名指令支持给一个命名空间或一个类起一个别名。
大部分程序集由一个单独的文件构成,结构如下:
多文件程序集包含一个主模块(primary module)和多个次要模块(secondary modules),次要模块后辍名为.netmodule,结构如下:
程序集的标识符(identity)由4部分组成:
- 简单名:不包含扩展名的文件名,也称为程序集名或友好名称(friendly name),如MyProgram。
- 版本号:由4个整数组成,格式为MayjorVersion.MinorVersion.Build.Revsion,如2.0.345.9。
- 文化信息:2-5个字符的字符串,代表一种语言和地域,如en-US。
- 公钥:128字节字符串,是生产程序集的公司唯一的。
完全限定名称:由简单名、版本号、文化信息和16字节公钥凭据组成。
强命名(strongly named)程序集有数学签名,数学签名是根据组成程序集的字节序列、简单名、版本号、文化信息、公钥/私钥对散列处理生成的,因此强命名程序集不会被更改。
弱命名的(weakly named)程序集没有数学签名,因此它是不安全的。
在VS中在工程属性中选择签名页,选择Sign the Assembly复选框并输入密钥文件的位置或创建一个新的,编译代码时,编译器生成一个强命名的程序集。
- 命令行工具Strong Name也可以创建强命名程序集,Strong Name是随VS自动安装的。
程序集的私有部署:指将程序集复制到一个位置,只要它依赖的文件都在同一目录下,它就能正常工作。这样部署的程序集称为私有程序集,部署方法也称为复制文件(XCopy)部署。
私有程序集可以是强命名也可是弱命名,不需要在注册表中注册,只需要删除它,就卸载了这个程序集。
私有程序集所在的目录,称为应用程序目录。
共享程序集:放到全局程序集缓存(GAC)中的程序集,称为共享程序集,其他程序集也能使用。
只有强命名的程序集可以被添加到GAC中。GAC早期版本只支持.dll,现在也支持.exe。
GAC在Windows中,.NET 4.0之前位于\Windows\Assembly中,.NET 4.0开始位于\Windows\Microsoft.NET\assembly中。
命令行工具gacutil.exe支持将程序集添加到GAC,或从GAC中删除程序集。它的参数:
- /i表示添加程序集。
- /u表示删除程序集。
- /l表示列出GAC中的程序集。
因为程序集的标识符由4部分组成,所以GAC中的程序集可以有相同的文件名,这被称为并肩执行(side-by-side Execution)。
如果你不想要重新编译程序,又希望程序使用新版本的程序集,那么你可以创建一个配置文件,它可以告诉CLR使用新版本而不是旧版本。配置文件的名称由可执行文件全名(含扩展名)加上扩展名.config组成。配置文件的内容是XML,如何编写超出了本书的范围。
延迟签名(delayed signing):因为公司不希望它的公钥/私钥,被不可靠的人拿到,伪装成公司的程序发布。所以强命名通常在开发末尾进行。但是弱命名的程序集又无法被添加到GAC,对开发人员造成影响,延迟签名又称为部分签名(partial signing)用于解决这个问题,方法如下:
将延迟签名的程序员添加到GAC,还需要取消这个程序员在这台机器上的签名确认,类似以下代码即可:
sn -vr MyAssemly.dll