Assembly、CLR、GAC
上一篇 / 下一篇 2008-05-10 11:03:27 / 个人分类:软件开发相关
0h `)K ]-nC0assembly程序集51Testing软件测试网1y[$Pdc1LZ
51Testing软件测试网Q/r]-Sq6MB]i_
assembly是构成一个逻辑单元的一个或多个文件的集合。在这里的“文件”通常是指托管模块,但程序51Testing软件测试网)A Era%sL7R [%V;{
集也能包含其他的文件。大部分程序集只包含一个文件,但是程序集能够而且有时确实包含多个文件。51Testing软件测试网b,K?-\n4f!f'r
组成多个文件程序集的所有文件必须位于相同的目录下。当使用C#编译器生成简单的EXE文件时,这个51Testing软件测试网)u:]:d.W;K0g
EXE文件时,这个EXE文件不仅仅是托管模块,它同时也是程序集。大多数编译器可以生成非程序集的模51Testing软件测试网'l$i5c iUc_e
块,也能够向自己创建的程序集添加其他文件。.net框架SDK还提供了一个名为AL(程序集连接器)的
yu ZR$Z0工具,它可以将文件联接成程序集。
4Ni!WC6^5LTJ0
nub(H+_Ige8FB0多文件程序集通常用于将用不同语言编写的模块相结合,或将托管模块同包含JPEG或其他资源的普通文
M[9PsM#j0件相结合。多文件程序集还被用来将应用程序划分为可下载的单元,这对部署在Internet上的代码十分
]XH)t!T3NG2_0有用。
P+r:fVGk9C
r)b0
uvb?;a/Rk@CY&Y0CLR是如何知道那些文件属于一个程序集?在程序集中的一个文件中包含一个清单(manifest)从物理角51Testing软件测试网eb6?|8c
度,清单只是增加的元数据;当编译器生成托管模块,而该托管模块又碰巧是程序集的时候,它将清单写
])X!a,F(x0入模块的元数据之内。从逻辑的角度而言,清单是程序集内容的路径图。它最重要的元素有以下几种51Testing软件测试网U.w,~v4u&U6F
程序集的名称51Testing软件测试网:N9@-z[$D@
程序集中其他文件的列表
g^l[#J
gD{Iiq0从程序集的其他文件中导出的数据类型的列表,和将这些数据类型映射到定义它们的文件的信息51Testing软件测试网qalNM^/I
版本号,格式为:主版本号.次版本号.内部版本号.修订号
hI4Y3`'[U051Testing软件测试网__p[gi0HCi5F
清单还包括其他信息,例如公司名称、描述、安全许可和区域性字符串。后者对程序集的目标国别进行51Testing软件测试网6UG:MM ^"M
界定(如en-US 表示美式英语)并且通常与所谓的“附属程序集”一起使用。描述一个由3个托管模块51Testing软件测试网#L\G2aP0U
和一个JPEG文件组成的多文件程序集。Main.exe文件包含清单,清单包括对其他文件的引用。从文件系
$]-Iw6cf}G:T0统角度考虑,这些文件仍然是独立的文件。但是对于CLR,它们是一个逻辑实体。
\ ~*RsS~I\051Testing软件测试网sQ2a1GKO0pb6O
如果缺少指示程序集要完成什么操作信息,编译器默认生成弱名称的程序集。“弱名称”意味着程序没
[*sy:~qqT(F2I0有经过加密签名,CLR只使用程序集清单中存储的名称(不包括扩展名的程序集文件名)表示程序集。但51Testing软件测试网1P
W.}Bsy-k
程序集可以具有强名称。强名称程序集包含出版者的公匙和数字签名(公匙所在的程序集清单的散列)
:~-`9LL?:^0
}&p4NP)y]2B`0数字签名通过出版者私匙生成并由公匙确认。强名称程序集的表示源于程序集名称、公匙、版本号和区51Testing软件测试网H/w#v"g| [iz
域性字符串。不论多小的差异,都足以区别两个不同的程序集。
af.]ui-G+S051Testing软件测试网a2O@d~`%r
SDK的AL实用工具能用来创建强名称程序集。大多数语言编译器,包括C#和Visual Basic .NET编译器51Testing软件测试网.{|b)mc
,也能创建强名称程序集。是部署弱名称程序集还是强名称程序集取决于你,你可以根据程序集的目标51Testing软件测试网!qMkG3th w \
应用来确定。如果要将程序集部署在全局程序集缓存GAC中——放置可供多个应用程序公享的程序集的
ub'U
Y Q7W0全局仓库,那么一定要使用强名称程序集。
Pw9kXWM0
r']2oL8hX0如果希望进行版本检查,也需要对程序集使用强名称。当CLR加载弱名称的程序集时,它不进行版本检查
[0aJ!Uw;`o0——当你用新版本替换旧版本的程序集(也许新版本修订了旧版本中的某些错误时,并且希望使用该程51Testing软件测试网*EH xp'tim
C
序的应用程序集的应用程序能够自动使用更新的程序集,这一点很有利。但是,当你针对某个版本的程
J%^z"xUA@0序集仔细地测试了应用程序后,有人又用某个可能存在缺陷的程序集替换了旧版本的程序集,这样很糟51Testing软件测试网\?#H3~oiSP
G
糕。这是Windows开发者经常遇到的“DLL地狱”。强名称可以解决这个问题。当CLR加载强名称程序集时51Testing软件测试网m'Ei)vr
,它会将程序集中的版本号同应用程序加载的版本号进行对照(该信息被记录在模块的元数据当中)如
}ua@L{B1vT y0果版本号不匹配,CLR会引发异常
s9Ba)aK+K'M9o0
wNc#G7N:BO0当然严格的版本检查也有它自己的缺陷。如果你决定使用强名称,但后来在程序集中发现一个错误。你
y,_;Wc8JUc0更正了错误并部署已修正的程序集。但是,使用该程序集的应用程序不加载新版本的程序集,除非你重
6CXv1v*D[p8LMHr0建应用程序。而且如果你删除旧版本,应用程序根本就不运行。解决方法是修改CLR绑定策略。管理员51Testing软件测试网7{!wu _z+Zr-XoemT*@
可以通过编辑配置文件将CLR指向新版本的强名称程序集。当然,如果新版本有问题,你就又碰上了麻
| @]Ax x1E}9{C0烦了,这就是为什么不要随便授予别人管理员特权。51Testing软件测试网;b)}fonti_ W+z
51Testing软件测试网&d\A"T*k)^Dz
操作程序集听起来很复杂,当然,又些时候是这样,幸运的是,如果不需要创建共享程序集或者链接到51Testing软件测试网c ^ kk!y
其他程序集(除了FCL之外,它是一组共享程序集)的程序集,大部分关于命名和绑定的问题就不需要
ci[)A*Kr0考虑。你所做的是启动编译器,把程序集复制到指定目录,然后运行。
基本概念
;r0lP+a!{Y_ F0
?)S1h-dce0托管模块(Managed Module)51Testing软件测试网mLn"m&n.j
&P1i8|&}5X:@G~8\:vbH0托管模块是一个需要CLR才能执行的标准Windows可移植可执行(portable executable,简称PE)文件。51Testing软件测试网;L|p.y){&d&@W
F4Nxq2L0元数据(Metadata)51Testing软件测试网"o:Xkkl
'Ko A w4V3r$Bf0简单的讲,元数据就是一个数据表的集合,在这些表中,其中一些用于描述托管模块中所定义的内容(比如所定义的类型和它们的成员),另外还有一些用于描述托管模块中所引用的内容(比如被引用的类型和它们的成员)。
dTq4@lnb*c0