Assembly、CLR、GAC
上一篇 / 下一篇 2008-05-10 11:03:27 / 个人分类:软件开发相关
X1HX6h?
P0assembly程序集
\,M4zB v2`a5O051Testing软件测试网]5t&rgw0mE
assembly是构成一个逻辑单元的一个或多个文件的集合。在这里的“文件”通常是指托管模块,但程序
C#T&Hu ?1W,Dt(W0集也能包含其他的文件。大部分程序集只包含一个文件,但是程序集能够而且有时确实包含多个文件。
f;GC$[cU9B0组成多个文件程序集的所有文件必须位于相同的目录下。当使用C#编译器生成简单的EXE文件时,这个51Testing软件测试网jK&|%a:W)^
EXE文件时,这个EXE文件不仅仅是托管模块,它同时也是程序集。大多数编译器可以生成非程序集的模51Testing软件测试网5X!J1nQWv-j1[
块,也能够向自己创建的程序集添加其他文件。.net框架SDK还提供了一个名为AL(程序集连接器)的51Testing软件测试网a6Ru x,od"g}a
工具,它可以将文件联接成程序集。51Testing软件测试网Bu)h3G-oI `4h/c
p#f)W2qr0多文件程序集通常用于将用不同语言编写的模块相结合,或将托管模块同包含JPEG或其他资源的普通文
3s
V}&?"{2n*h0件相结合。多文件程序集还被用来将应用程序划分为可下载的单元,这对部署在Internet上的代码十分51Testing软件测试网/fyWt)u"\+P
有用。
+[8_R\{+Ma%t0
.A
[UvZN,pe5FS UM0CLR是如何知道那些文件属于一个程序集?在程序集中的一个文件中包含一个清单(manifest)从物理角51Testing软件测试网9V`5j7k1q^
度,清单只是增加的元数据;当编译器生成托管模块,而该托管模块又碰巧是程序集的时候,它将清单写51Testing软件测试网kMO4G#R.CSG
入模块的元数据之内。从逻辑的角度而言,清单是程序集内容的路径图。它最重要的元素有以下几种
A'D'AX(m5u.o0程序集的名称51Testing软件测试网i$Sso6t
程序集中其他文件的列表
^k^6OrK"K0从程序集的其他文件中导出的数据类型的列表,和将这些数据类型映射到定义它们的文件的信息
tXls8aJo2R ^0版本号,格式为:主版本号.次版本号.内部版本号.修订号
2b6?6nC? M ]g051Testing软件测试网7~)}#N
|R7N
清单还包括其他信息,例如公司名称、描述、安全许可和区域性字符串。后者对程序集的目标国别进行
tHD^5tk0界定(如en-US 表示美式英语)并且通常与所谓的“附属程序集”一起使用。描述一个由3个托管模块51Testing软件测试网8_7hU.Rw
vq7B
和一个JPEG文件组成的多文件程序集。Main.exe文件包含清单,清单包括对其他文件的引用。从文件系
W$wA3sblR0统角度考虑,这些文件仍然是独立的文件。但是对于CLR,它们是一个逻辑实体。51Testing软件测试网Guh
`r;Uk5W
`,chs$cN0如果缺少指示程序集要完成什么操作信息,编译器默认生成弱名称的程序集。“弱名称”意味着程序没
qCt2D'J/P'y0有经过加密签名,CLR只使用程序集清单中存储的名称(不包括扩展名的程序集文件名)表示程序集。但
`&xF|6B+G0程序集可以具有强名称。强名称程序集包含出版者的公匙和数字签名(公匙所在的程序集清单的散列)
%i2|*v}I[H0
y!Q8N\7\&c5F4Z0数字签名通过出版者私匙生成并由公匙确认。强名称程序集的表示源于程序集名称、公匙、版本号和区
,qP&_&E5Bh7?)o.ak1O0域性字符串。不论多小的差异,都足以区别两个不同的程序集。51Testing软件测试网&WqHy9i[5L5Ju
4D&{0c1HYE4{,J dH8C0SDK的AL实用工具能用来创建强名称程序集。大多数语言编译器,包括C#和Visual Basic .NET编译器
e[UV9T4xpJ0,也能创建强名称程序集。是部署弱名称程序集还是强名称程序集取决于你,你可以根据程序集的目标51Testing软件测试网LBCw\!`X
应用来确定。如果要将程序集部署在全局程序集缓存GAC中——放置可供多个应用程序公享的程序集的
dy)z2q6X8pZeU0全局仓库,那么一定要使用强名称程序集。51Testing软件测试网(Y u {{)xH2H2mEi
51Testing软件测试网v o3{"IkT'D5I
如果希望进行版本检查,也需要对程序集使用强名称。当CLR加载弱名称的程序集时,它不进行版本检查51Testing软件测试网7s qWDh
]2N
——当你用新版本替换旧版本的程序集(也许新版本修订了旧版本中的某些错误时,并且希望使用该程51Testing软件测试网,N/E5e@4wLG
序的应用程序集的应用程序能够自动使用更新的程序集,这一点很有利。但是,当你针对某个版本的程
.G@]JJV
fi0序集仔细地测试了应用程序后,有人又用某个可能存在缺陷的程序集替换了旧版本的程序集,这样很糟51Testing软件测试网u eFDN5@D$P
糕。这是Windows开发者经常遇到的“DLL地狱”。强名称可以解决这个问题。当CLR加载强名称程序集时51Testing软件测试网'G;\Yd)cX
,它会将程序集中的版本号同应用程序加载的版本号进行对照(该信息被记录在模块的元数据当中)如
e,kh uC#C0果版本号不匹配,CLR会引发异常51Testing软件测试网OP9?Gzj
p5^+Rd%I7b3^0当然严格的版本检查也有它自己的缺陷。如果你决定使用强名称,但后来在程序集中发现一个错误。你51Testing软件测试网/Jp2[i%aMw%FD0i
更正了错误并部署已修正的程序集。但是,使用该程序集的应用程序不加载新版本的程序集,除非你重
q7\&S[n0w@0建应用程序。而且如果你删除旧版本,应用程序根本就不运行。解决方法是修改CLR绑定策略。管理员
F@
W"i!qp0可以通过编辑配置文件将CLR指向新版本的强名称程序集。当然,如果新版本有问题,你就又碰上了麻51Testing软件测试网'UH7y{v$?}VW
烦了,这就是为什么不要随便授予别人管理员特权。
`I9GY
Wm'J0E0
r1xD pw~6v(n)Mx3B0操作程序集听起来很复杂,当然,又些时候是这样,幸运的是,如果不需要创建共享程序集或者链接到