Assembly、CLR、GAC
上一篇 / 下一篇 2008-05-10 11:03:27 / 个人分类:软件开发相关
4^
`\k,['KSa1H0assembly程序集51Testing软件测试网$|3BEU
~@v
51Testing软件测试网$]1B[hHE
C
assembly是构成一个逻辑单元的一个或多个文件的集合。在这里的“文件”通常是指托管模块,但程序
7x5R'g]'?!I0集也能包含其他的文件。大部分程序集只包含一个文件,但是程序集能够而且有时确实包含多个文件。
!C\b]%kEf5Z0组成多个文件程序集的所有文件必须位于相同的目录下。当使用C#编译器生成简单的EXE文件时,这个51Testing软件测试网&jeV
HX!y
EXE文件时,这个EXE文件不仅仅是托管模块,它同时也是程序集。大多数编译器可以生成非程序集的模51Testing软件测试网hB;G1P5ei"j*^*v
块,也能够向自己创建的程序集添加其他文件。.net框架SDK还提供了一个名为AL(程序集连接器)的51Testing软件测试网\5}P'Y/OC[
工具,它可以将文件联接成程序集。
4a w2fdE(I0
.WC
qh3N wd0多文件程序集通常用于将用不同语言编写的模块相结合,或将托管模块同包含JPEG或其他资源的普通文
(j O3y|p-kk0件相结合。多文件程序集还被用来将应用程序划分为可下载的单元,这对部署在Internet上的代码十分51Testing软件测试网v;Pp8l1T.` Jk
有用。51Testing软件测试网{9]0pt,?`7S.tb
51Testing软件测试网(^$kq!V,b~
CLR是如何知道那些文件属于一个程序集?在程序集中的一个文件中包含一个清单(manifest)从物理角51Testing软件测试网p%A0f4M(Z
度,清单只是增加的元数据;当编译器生成托管模块,而该托管模块又碰巧是程序集的时候,它将清单写51Testing软件测试网dq`o$?r
入模块的元数据之内。从逻辑的角度而言,清单是程序集内容的路径图。它最重要的元素有以下几种
Pxw&Yg}0程序集的名称51Testing软件测试网eH R/AH(I5q
程序集中其他文件的列表51Testing软件测试网1s8t*La3[)v%c
p-D'E
从程序集的其他文件中导出的数据类型的列表,和将这些数据类型映射到定义它们的文件的信息51Testing软件测试网:M,rhwgS
版本号,格式为:主版本号.次版本号.内部版本号.修订号
gLN^Ht1\ s(x0
,y3s,E6Pe.G@)@0清单还包括其他信息,例如公司名称、描述、安全许可和区域性字符串。后者对程序集的目标国别进行51Testing软件测试网S)O
t8B\ rJ]3G
界定(如en-US 表示美式英语)并且通常与所谓的“附属程序集”一起使用。描述一个由3个托管模块
F-B!V.ee&Y0和一个JPEG文件组成的多文件程序集。Main.exe文件包含清单,清单包括对其他文件的引用。从文件系
k[s3c*G9~ h0统角度考虑,这些文件仍然是独立的文件。但是对于CLR,它们是一个逻辑实体。51Testing软件测试网
M8T7z#HH
51Testing软件测试网-i%?'c7?kj0O1D
如果缺少指示程序集要完成什么操作信息,编译器默认生成弱名称的程序集。“弱名称”意味着程序没51Testing软件测试网2J3p_P!q]7Yb!AX
有经过加密签名,CLR只使用程序集清单中存储的名称(不包括扩展名的程序集文件名)表示程序集。但51Testing软件测试网-H&XE8QH:m%vf
程序集可以具有强名称。强名称程序集包含出版者的公匙和数字签名(公匙所在的程序集清单的散列)
w.B%i$L9b051Testing软件测试网I`l'S"Hh#gg
数字签名通过出版者私匙生成并由公匙确认。强名称程序集的表示源于程序集名称、公匙、版本号和区51Testing软件测试网
F3u(_?&ca0CK
域性字符串。不论多小的差异,都足以区别两个不同的程序集。
?s8L2aR051Testing软件测试网.{.@{[$eG\C o][
SDK的AL实用工具能用来创建强名称程序集。大多数语言编译器,包括C#和Visual Basic .NET编译器
%?Ir!_(_O0,也能创建强名称程序集。是部署弱名称程序集还是强名称程序集取决于你,你可以根据程序集的目标
!l!E1]B
d0应用来确定。如果要将程序集部署在全局程序集缓存GAC中——放置可供多个应用程序公享的程序集的
_
Wtp8E
?WE/J0全局仓库,那么一定要使用强名称程序集。
@s n1N,{ n
Z-~1_o#j[0
'j\
C0^uTY0如果希望进行版本检查,也需要对程序集使用强名称。当CLR加载弱名称的程序集时,它不进行版本检查51Testing软件测试网qb"R,i[S
——当你用新版本替换旧版本的程序集(也许新版本修订了旧版本中的某些错误时,并且希望使用该程
@!n2\cl/UW9g0序的应用程序集的应用程序能够自动使用更新的程序集,这一点很有利。但是,当你针对某个版本的程51Testing软件测试网0X@AX;z(p
序集仔细地测试了应用程序后,有人又用某个可能存在缺陷的程序集替换了旧版本的程序集,这样很糟
9j XtiP~#kH
Q0糕。这是Windows开发者经常遇到的“DLL地狱”。强名称可以解决这个问题。当CLR加载强名称程序集时51Testing软件测试网A`iZ1m,n7a
,它会将程序集中的版本号同应用程序加载的版本号进行对照(该信息被记录在模块的元数据当中)如51Testing软件测试网+iJu
m%H0[F3y
果版本号不匹配,CLR会引发异常
z*cf#?O#X
{i0
nm"J[F*L0当然严格的版本检查也有它自己的缺陷。如果你决定使用强名称,但后来在程序集中发现一个错误。你
x:[Yu.znO2K7Q-A4V$a0更正了错误并部署已修正的程序集。但是,使用该程序集的应用程序不加载新版本的程序集,除非你重
|-U*r%n9@%{c0建应用程序。而且如果你删除旧版本,应用程序根本就不运行。解决方法是修改CLR绑定策略。管理员
~x7~v:nu\;yPGE5U.V0可以通过编辑配置文件将CLR指向新版本的强名称程序集。当然,如果新版本有问题,你就又碰上了麻51Testing软件测试网/Vd%x#zfE;X#R,xW5?
烦了,这就是为什么不要随便授予别人管理员特权。