技术只有在交流分享中才能更上一层楼! 复杂的事简单做。 简单的事认真做。 认真的事重复做。 重复的事创造性做。

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 H X!y
EXE文件时,这个EXE文件不仅仅是托管模块,它同时也是程序集。大多数编译器可以生成非程序集的模51Testing软件测试网hB;G1P5ei"j*^*v
块,也能够向自己创建的程序集添加其他文件。.net框架SDK还提供了一个名为AL(程序集连接器)的51Testing软件测试网\5}P'Y/OC[
工具,它可以将文件联接成程序集。
4aw2fdE(I0
.WC qh3Nwd0多文件程序集通常用于将用不同语言编写的模块相结合,或将托管模块同包含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*L a3[)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#H H
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
域性字符串。不论多小的差异,都足以区别两个不同的程序集。
?s8L2a R051Testing软件测试网.{.@{[$eG\Co][
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?
烦了,这就是为什么不要随便授予别人管理员特权。
S9U_H)T051Testing软件测试网7p^ tJLO `
操作程序集听起来很复杂,当然,又些时候是这样,幸运的是,如果不需要创建共享程序集或者链接到51Testing软件测试网L x ` e)T4]NH
其他程序集(除了FCL之外,它是一组共享程序集)的程序集,大部分关于命名和绑定的问题就不需要
b{V5^m+O0考虑。你所做的是启动编译器,把程序集复制到指定目录,然后运行。

2M~9BI1T!e!CY)Ch*U051Testing软件测试网a%ommaa\)P

基本概念
jO.pfz]051Testing软件测试网6S a'{n6[^&n
托管模块(Managed Module)
l yg"XH051Testing软件测试网uPQ5L rC
托管模块是一个需要CLR才能执行的标准Windows可移植可执行(portable executable,简称PE)文件。51Testing软件测试网Yr1A/a+~n7O+x W

S h Q:[5] Y+x0元数据(Metadata)
!J;~%O\x*M051Testing软件测试网FKCf(X.n0~F_
简单的讲,元数据就是一个数据表的集合,在这些表中,其中一些用于描述托管模块中所定义的内容(比如所定义的类型和它们的成员),另外还有一些用于描述托管模块中所引用的内容(比如被引用的类型和它们的成员)。51Testing软件测试网RjA wE|R1W5\
51Testing软件测试网qC&R]-h_:o&k/Xr
URL: ms-help://MS.MSDNQTR.2004APR.1033/cpguide/html/cpconmetadataoverview.htm51Testing软件测试网 M7v8G s7|ic

%O1v9L4BW;O0程序集清单(Assembly Manifest)51Testing软件测试网,A ?uy y

mZz W FYA/{0程序集清单是另外一些元数据表的集合。这些表描述了组成程序集的文件,程序集所有文件中实现的公有导出类型,以及一些程序集相关的资源文件或数据文件。51Testing软件测试网,X {B(B0RI"J#HF
51Testing软件测试网n0i)Vg,j
ms-help://MS.MSDNQTR.2004APR.1033/cpguide/html/cpconAssemblyManifest.htm
[M)HlZ(`jH0wR0
1H.S`n.h-p0
H.zkZ#Nzn'`01.程序集(Assembly)的概念:
ZX7P"?)R.T7ti051Testing软件测试网R {4d-M t9|.WL
首先:程序集是一个或多个托管模块,以及一些资源文件的逻辑组合。因为它是一个逻辑上的组合,所以程序集的逻辑表示和物理表示可以相互分离。如何将代码和资源划分到不同的文件中完全取决于我们。例如,我们可以将一些很少使用的类型或资源放在一个单独的Assembly Module中,然后根据需要(比如第一次用到的时候),从web上下载它们。如果没有用到,它们将不会被下载。这样既节省磁盘空间,也减少了安装时间。程序集允许我们将文件的部署分解开来,同时又将所有的文件看作一个单独的集合。
0U?:b8h]&@d051Testing软件测试网&OA,y~ l`1J r:M p
    其次:因为CLR是直接和程序集打交道的,所以程序集也是组件复用,以及实施安全策略和版本策略的最小单元(安全策略,版本信息等都只能是加在程序集上)。
S0dF#^ s~051Testing软件测试网vW"^ts2\
注意:程序集是一个逻辑组合,它可以包含很多个文件。大多数程序集(比如使用Visual Studio.NET创建的那些)一般都是单文件程序集,也就是只有一个.exe或者.dll文件(目前.NET的程序集只有这两种格式)。在这种情况下,程序集清单(manifest)直接嵌入到单文件程序集中。但是,你也可以用“程序集生成工具”(Al.exe)来创建多文件程序集。也可以只创建一个只包含清单的程序集。 51Testing软件测试网+UG sHR Ms
51Testing软件测试网 B K$}7aW
51Testing软件测试网+KAHX%k"X(e F D
2.强命名程序集(Strong Name Assembly)的概念
}$UaG,GJE0
3[ u ~ wvt0因为不同的公司可能会开发出有相同名字的程序集来,如果这些程序集都被复制到同一个相同的目录下,最后一个安装的程序集将会代替前面的程序集。这就是著名的Windows “DLL Hell”出现的原因。
[ iof/p f-K0
@/PAI T"J#jx4Fs0很明显,简单的用文件名来区分程序集是不够的,CLR需要支持某种机制来唯一的标识一个程序集。这就是所谓的强命名程序集。51Testing软件测试网i| j h2T:F

Cq_3eF$z0一个强命名程序集包含四个唯一标志程序集的特性:文件名(没有扩展名),版本号,语言文化信息(如果有的话),公有秘钥。
kB ?} t;~Y051Testing软件测试网!RR\-q([)E
这些信息存储在程序集的清单(manifest)中。清单包含了程序集的元数据,并嵌入在程序集的某个文件中。51Testing软件测试网JXK1r5@
51Testing软件测试网ZoB AXdn
下面的字符串标识了四个不同的程序集文件:51Testing软件测试网`w$a ZFZ&I
51Testing软件测试网0rJ d\6?#?
“MyType, Version=1.0.1.0, Culture=neutral, PublicKeyToken=bf5779af662fc055”51Testing软件测试网}R9G u/I6Pz0t}I)w

G'gnjk wP0“MyType, Version=1.0.1.0, Culture=en-us, PublicKeyToken=bf5779af662fc055”51Testing软件测试网%Ng-w p+ELD
51Testing软件测试网 EhN"a]J(Z(T m~
“MyType, Version=1.0.2.0, Culture=neturl, PublicKeyToken=bf5779af662fc055”51Testing软件测试网(d6f;gA,hgyAuV
51Testing软件测试网2c1\.K y W-k ?M
“MyType, Version=1.0.2.0, Culture=neutral, PublicKeyToken=dbe4120289f9fd8a”
7fc&bhN.b2hu g&j0
/v%J+Vgp0如果一个公司想唯一的标识它的程序集,那么它必须首先获取一个公钥/私钥对,然后将共有秘钥和程序集相关联。不存在两个两个公司有同样的公钥/私钥对的情况,正是这种区分使得我们可以创建有着相同名称,版本和语言文化信息的程序集,而不引起任何冲突。51Testing软件测试网u,y$yg3\w3o&?(qh_
51Testing软件测试网 c5FQ}^'}

(B:WWS8t.P1b0    与强命名程序集对应的就是所谓的弱命名程序集。(其实就是普通的没有被强命名的程序集)。两种程序集在结构上是相同的。都使用相同的PE文件格式,PE表头,CLR表头,元数据,以及清单(manifest)。二者之间真正的区别在于:强命名程序集有一个发布者的公钥/私钥对签名,其中的公钥/私钥对唯一的标识了程序集的发布者。利用公钥/私钥对,我们可以对程序集进行唯一性识别、实施安全策略和版本控制策略,这种唯一标识程序集的能力使得应用程序在试图绑定一个强命名程序集时,CLR能够实施某些“已确知安全”的策略(比如只信任某个公司的程序集)。
1S"w)z5` F051Testing软件测试网c"ELDs{ o&N7rZt
51Testing软件测试网;vK(N!UdrJ?
3. 如何创建强命名程序集(Strong Name Assembly)
;C!S8b6_^/` Q051Testing软件测试网1N2^0U}S`6Vo1ZO$i
创建一个强命名程序集首先需要获得一个用强命名实用工具(Strong Name Utility,即SN.exe,.NET SDK自带)产生的密钥。51Testing软件测试网D(^XlS@xm e9k @

3H'@v L-b/p F0下面简要介绍一下SN.exe的一些用法。51Testing软件测试网4x*\ UBX*w9K:G
51Testing软件测试网 [!npd7PQI"x
要产生一个公钥/私钥对:51Testing软件测试网#b"U&i*zy

v w&U n_6p Gc0a) SN –k MyCompany.Keys
.S*\'wd Z051Testing软件测试网#Zzb#\8I(m:Cc.L
该命名告诉SN.exe创建一个名为MyCompany.keys的文件。MyCompany.keys文件将包含以对以二进制格式存储的公有密钥和私有密钥。51Testing软件测试网u yoo-@D5ib,e
51Testing软件测试网#@t(yN1y B_-T:h9Q-_{
b)查看公有密钥:51Testing软件测试网\`-T"X]!XA.Z8TR;R

-SsR1k |0首先生成一个只包含公有密钥的文件:
7JhK _!s"xEwi0
t6W(W o` `0SN –p MyCompany.keys MyCompany.PublicKey
dX ?B {7Q7sF@(e0
Z|DO{ y3a;aZrD0然后用-tp参数查看:SN –tp MyCompany.PublicKeys
r#PQYs|M'o051Testing软件测试网J2]uD0UB$f4k0w
Public key is51Testing软件测试网]bg*P6~H

'l,Ih$o _0c,I,[ L00024000004800000940000000602000000240000525341310004000001000100bb7214723ffc1351Testing软件测试网0mm5ko m"j(J

2KP oi@1y!w.A0901343df4b9c464ebf7ef4312b0ae4d31db04a99673e8163768cc0a2a7062e731dbeb83b869f0551Testing软件测试网&y2JBmA`8YI,a@/_
51Testing软件测试网 F6A)tYD?2f@
09bf8009e90db5c8728e840e782d2cf928dae35c2578ec55f0d11665a30b37f8636c08789976d8
0MS HM5G(r051Testing软件测试网{#y(\|+W
ee9fe9a5c4a0435f0821738e51d6bdd6e6711a5acb620018658cce93df37d7e85f9a0104a5845051Testing软件测试网wf`|"]/^

k4J(Nx ^(_9z;t3@$aJ.Y053995ce8
GLcX2lA5YAE;X0
L;];Y"HbO fO0
Z*L4s!~)M0Public key token is 2dc940d5439468c2
(o KJwk$[K?051Testing软件测试网}^/g B)n;Q
创建好了公钥/私钥对,创建强命名程序集就很容易了。只需要把System.Reflection.AssemblyKeyFileAttribute特性加入到源代码中就可以了: [assembly:AssemblyKeyFile("MyCompany.keys")]51Testing软件测试网)B2eA0_wZY L
51Testing软件测试网;G[_(IGTDQ

k pSB.gV0说明:公钥/私钥对文件的扩展名可以是任意的(也可以没有),因为编译的时候都是以元数据的格式读取的。51Testing软件测试网F1|W"~ML4O^0H:I rk

"?QtPf"Oo0
])r,p ^O3?r N04. 程序集的部署方式51Testing软件测试网HSDm6jG;Si
51Testing软件测试网v*xk_/}R6eH
一个程序集有两种部署方式:51Testing软件测试网d3azs-@8W~

p$W!K#i3@ wKo0a) 私有方式51Testing软件测试网7S'I-l/i6B-\
51Testing软件测试网Nw;N-G*lg ?
和应用程序部署在同一目录下的程序集称作私有部署程序集。弱命名程序集只能进行私有部署。51Testing软件测试网~,GDhMp
51Testing软件测试网 v#P~U(U
b)全局方式
E-}`6u AJl051Testing软件测试网f/^8s1Y^
全局部署方式将程序集部署在一些CLR已确知的地方,当CLR搜索程序集时,它会知道到这些地方去找。强命名程序集既可以进行私有部署,也可以进行全局部署。
7p4}iU2v051Testing软件测试网6AMcO{1L

程序集种类
是否可以进行私有部署
是否可以进行全局部署
普通程序集
强命名程序集

0BbV.i Q3m.Rc0

%k(C6LPWH05.如何部署强命名程序集(Strong Name Assembly)和GAC51Testing软件测试网e3x'b9IS`

+^1x.FyN0a)GAC的概念51Testing软件测试网/g9bo'WQk

'drC/S+o0如果一个Assembly要被多个应用程序访问,那么他就必须放在一个CLR已确知的目录下,并且CLR在探测到有对该Assembly的引用时,它必须能自动到该目录下寻找这个程序集。这个已确知的目录称作GAC(Global Assembly Cache),就是全局程序集缓存。它一般位于下面的目录下::\Windows\Assembly\GAC。51Testing软件测试网u0_&T?L

P1_l0i!G%Wu:~-zg0GAC的作用就是提供给CLR一个已知的确定的目录去寻找引用的程序集。51Testing软件测试网!fnf)I*SwD;tQV

[ zV"c@051Testing软件测试网tgUG;?+F.Y6H?u
b) GAC的内部结构
ywS_l%kq%`0
udx/J*F/nkD gz0GAC是一个特殊的结构化的目录,用Windows Explorer浏览你会以为它只是一个包含很多程序集的普通目录。其实不是这样的,在命令行下查看,你会发现它实际上包含很多子目录,子目录的名字和程序集的名称是相同的,但它们都不是实际的程序集,实际的程序集位于程序集名对应的目录下。比如进入GCFWK子目录,我们会发现其中又有很多的子目录。51Testing软件测试网h)S3ih`5u
51Testing软件测试网f*H{.l Kz]*W

n]~7_V$V051Testing软件测试网7lV gK-Mw y

机器内每一个安装到GAC的GCFWK.dll在GCFWK中都会有一个子目录。这里只有一个目录表明只有一个版本的GCFWK程序集被安装。实际的程序集保存在每一个对应的版本目录下。目录的名称以下划线的形式分割为“(Version)_(Culture)_(PublicKeyToken)”。51Testing软件测试网4l0a-mKOn.t DcY

3j3n m9B0FF0o UK0GCFWK的语言文化信息为netture,就表示为1.0.0.0__bf5779af662fc055”。51Testing软件测试网F*a9i1{$C,J

lt"`'ZsmLg)Qs0表示得意义是:51Testing软件测试网`Q M7fg)z%qh;X

Vwa+S*JX2z!t0“GCFWK, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bf5779af662fc055”51Testing软件测试网@8ZcUdx3i6Y]

H/oS4@)B7i^ Z0如果语言文化信息为”ja”,就表示为”1.0.0.0_ja_bf5779af662fc055”
f!LCg[051Testing软件测试网V3u2Z8sm9pk0c|
表示得意义是:
8w1\0b6w9^.O8|0
(H.V]%`1V PJs0“GCFWK, Version=1.0.0.0, Culture=ja, PublicKeyToken=bf5779af662fc055”51Testing软件测试网@sOa@ c

)m|6V7Zz]V%Z*t!T0?c)部署强命名程序集到GAC51Testing软件测试网e3v%kY-\%{ h*T
51Testing软件测试网,SPJp IQ
GAC包含很多子目录,这些子目录是用一种算法来产生的,我们最好不要手动将程序集拷贝到GAC中,相反,我们应使用工具来完成这样的工作。因为这些工具知道GAC的内部结构J51Testing软件测试网4^yA yO E!K F0`p
51Testing软件测试网*z bK*V"i-ChcLlc
在开发和测试中,最常用的工具就是GACUtil.exe。
-GX NX H E#s"C%x051Testing软件测试网,S%C'md!vK4Bv0G
在GAC中注册程序集跟COM注册差不多,但相对更容易:
wTJ-e/D @eGF051Testing软件测试网!xI'DY0?!x
1.把程序集添加到GAC中:51Testing软件测试网&W!}5~N9E7u
GACUtil /i sample.dll51Testing软件测试网1sG{IL l6Ss
(参数/i是安装的意思)
o,t!Z N!_051Testing软件测试网~ {id.g I&x:Z
2.把程序集移出GAC51Testing软件测试网Dt!JTi
51Testing软件测试网,?-v@F2G\7J
GACUtil /u sample.dll51Testing软件测试网J6U0ci"r#Q_
(参数/u就移除的意思)51Testing软件测试网&B Aj {3Y`sn/NZ
51Testing软件测试网%Ko3o;e4W6g9D b(CX
注意:不能将一个弱命名程序集安装到GAC中。51Testing软件测试网'N?2WMWm nb,M
51Testing软件测试网8J*OSf)n f
如果你试图把弱命名程序集加入到GAC中,会收到错误信息:” Failure adding assembly to the cache: Attempt to install an assembly without a strong name”
)FVBmB051Testing软件测试网 Gr{~3L~Q
51Testing软件测试网mJT4xx}
d) 强命名程序集的私有部署51Testing软件测试网:[+k$Po4~z,F4V

9i~-Ba,\-R*K$m0把程序集安装到GAC有几个好处。首先,GAC使得很多程序可以共享程序集,这从整体上减少了使用的物理内存;其次,我们很容易将一个新版的程序集部署到GAC中,并通过一种发布者策略(差不多就是一种重定向方法,比如将原来引用版本为1.0.0.0程序集的程序,通过更改它的配置文件,转而让程序去引用版本为2.0.0.0的程序集)来使用新版本;最后,GAC还提供了对不同版本程序集的并存(side-by-side)管理方式。但是,GAC的安全策略通常只允许管理员更改,同时,向GAC中安装程序集也破坏了.NET框架的简单拷贝部署的许诺。
Qxd+^ F"l+Kkp051Testing软件测试网'P B9Fi+G:W @
除了向GAC或者以私有部署方式部署强命名程序集之外,我们还可以将强命名程序集部署在仅为一小部分程序知道的某个任意目录下。配置每一个应用程序的XML配置文件,让它们指向一个公有目录,这样,在运行时,CLR将知道到哪里去找这个强命名程序集。但这样又有可能会引发”DLL Hell”的问题,因为没有哪个程序可以控制这个程序集何时被卸载。这在.NET中也是不被鼓励的。51Testing软件测试网)z{+mVU [&Q

J#QiVU*dH#T]{0
o\ OM;x%|2X;o_ XS06.并行执行(Side - By - Side)51Testing软件测试网%]1eC$WXT

:O(E*[&Sm&~W7u:[4BQ0这里是一个强命名程序集的例子:
MjS,W:g051Testing软件测试网w b5o6`r nD
首先有一个App.exe程序集,它绑定这一个版本为2.0.0.0的Calculus.dll程序集和一个版本为3.0.0.0的AdvMath.dll程序集。而AdvMath.dll程序集同时又绑定着一个版本为1.0.0.0的Calculus.dll的程序集。如下图:51Testing软件测试网h:tW[H6g3Oy

sC1k'KneR*Y(B(K l0

Y0o9tp8|zf"wv051Testing软件测试网#t3z#C7baX

An application that requires different versions of the Calculus.dll assembly
5[\+KgD051Testing软件测试网@0IZ2[:f3y g&`
    CLR能够将名程相同但路径不同的多个文件加载到同一个地址空间,这在.NET中称为并存执行(Side-By-Side)执行,它是解决Windows中”DLL Hole”问题的关键技术
9}/f!? rJ?I}0
Z+?+h(}q? GWf;s0   如.NET Framework 1.0 和.NET Framework 1.1都可以同是在一台机器上运行,这用到的就是并存执行(Side-By-Side)执行。51Testing软件测试网k o/@,q&?
51Testing软件测试网eWXr0W"Y Nif
更多参考:
+@~T4c"A Ch*Xh0
,`&{ G e\0ms-help://MS.MSDNQTR.2004APR.1033/cpguide/html/cpconSide-by-SideExecutionTop.htm
6uM w6A r^$x0
0cE?@K5b{ Chc(L0http://www.microsoft.com/china/msdn/archives/library/dnnetdep/html/sidexsidenet.asp51Testing软件测试网ky3m#`"l[
51Testing软件测试网\ @~Hq Q(s0PW

R*oI3PJ1cq,n07. CLR如何解析类型引用51Testing软件测试网*s,R?%x? E y0A-n%op

u3i&N4Yb(d0Rz&W0CLR在解析一个被引用的类型时,它可以在以下三个地方的其中之一找到该类型:51Testing软件测试网 K(q0gR@ Jby(~
51Testing软件测试网 m0nSNC!hlH._+['_
· 同一个文件
0T5?]6n9r DYa051Testing软件测试网jy-Ma sz,]6K
对同一个文件中类型的访问在编译时就已经确定下来了,CRL直接从该文件中加载被引用的类型。完成加载后,程序将继续运行。51Testing软件测试网$QG f[0U.q$P2TW

~HT6KjL[Z0·不同的文件,相同的程序集
` A_G)ym051Testing软件测试网v*G9Zv~%re
CLR首先确保被引用的文件在当前程序集清单中的FileDef表内。CLR然后会在加载程序集清单文件的目录中查找被引用的文件。该文件被加载的同时,CLR会检查它的散列值以确保文件的完整性,之后便会找到相应的类型成员。完成加载后,程序将继续运行。51Testing软件测试网 vZ#}8w/O,V
51Testing软件测试网 \eN}V
·不同的文件,不同的程序集51Testing软件测试网`8S*k'n_.c { YR

t9[&}S+]q0当被引用的程序集在一个不同的程序集文件中时,CLR会首先加载包含被引用程序集的清单所在的文件。如果该文件没有包含所需要的类型,CLR会根据此清单文件加载适当的文件。这样也会找到相应类型的成员。完成加载后,程序将继续运行。
3@/KdN&Q0
3@"O(j*I%WwNi0       如果在解析类型引用的过程中出现任何错误,比如文件找不到,文件不能被加载,散列值不匹配等等,系统将会抛出相应的异常。
4Ig(}t}g0m:F}Hh0
Ig P6W+BZ0下图演示了类型的绑定过程:51Testing软件测试网 bzS*Af nub
51Testing软件测试网7s#xS.k*dI'{'w
51Testing软件测试网z$y2|q!WTnGLY

51Testing软件测试网I{-A0w-p-S^aY

程序集种类
是否可以引用命名程序集
是否可以引用命名程序集
普通程序集
强命名程序集

H'}'F{,[t0
51Testing软件测试网MW)h.LM

 51Testing软件测试网6Rc"`&^4QP9t rG-P


TAG: assembly CLR GAC 软件开发相关

 

评分:0

我来说两句

日历

« 2024-05-05  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 22114
  • 日志数: 36
  • 文件数: 1
  • 建立时间: 2007-11-13
  • 更新时间: 2008-09-21

RSS订阅

Open Toolbar