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

Assembly、CLR、GAC

上一篇 / 下一篇  2008-05-10 11:03:27 / 个人分类:软件开发相关

X1HX6h? P0assembly程序集
\,M4zB v2`a5O051Testing软件测试网]5t&rgw0mE
assembly是构成一个逻辑单元的一个或多个文件的集合。在这里的“文件”通常是指托管模块,但程序
C#T&Hu ?1W,Dt(W0集也能包含其他的文件。大部分程序集只包含一个文件,但是程序集能够而且有时确实包含多个文件。
f;G C$[cU9B0组成多个文件程序集的所有文件必须位于相同的目录下。当使用C#编译器生成简单的EXE文件时,这个51Testing软件测试网jK&|%a:W)^
EXE文件时,这个EXE文件不仅仅是托管模块,它同时也是程序集。大多数编译器可以生成非程序集的模51Testing软件测试网5X!J1n QWv-j1[
块,也能够向自己创建的程序集添加其他文件。.net框架SDK还提供了一个名为AL(程序集连接器)的51Testing软件测试网a6Ru x,od"g}a
工具,它可以将文件联接成程序集。51Testing软件测试网Bu)h3G-oI `4h/c

p#f)W2q r0多文件程序集通常用于将用不同语言编写的模块相结合,或将托管模块同包含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^6O rK"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软件测试网&W qHy9i[5L5Ju

4D&{0c1HYE4{,J dH8C0SDK的AL实用工具能用来创建强名称程序集。大多数语言编译器,包括C#和Visual Basic .NET编译器
e[UV9T4xpJ0,也能创建强名称程序集。是部署弱名称程序集还是强名称程序集取决于你,你可以根据程序集的目标51Testing软件测试网LBCw\!`X
应用来确定。如果要将程序集部署在全局程序集缓存GAC中——放置可供多个应用程序公享的程序集的
dy)z2q6X8pZeU0全局仓库,那么一定要使用强名称程序集。51Testing软件测试网(Yu {{)xH2H2mEi
51Testing软件测试网v o3{"I kT'D5I
如果希望进行版本检查,也需要对程序集使用强名称。当CLR加载弱名称的程序集时,它不进行版本检查51Testing软件测试网7sqWDh ]2N
——当你用新版本替换旧版本的程序集(也许新版本修订了旧版本中的某些错误时,并且希望使用该程51Testing软件测试网,N/E5e @4w LG
序的应用程序集的应用程序能够自动使用更新的程序集,这一点很有利。但是,当你针对某个版本的程
.G@]JJV fi0序集仔细地测试了应用程序后,有人又用某个可能存在缺陷的程序集替换了旧版本的程序集,这样很糟51Testing软件测试网 u eFDN5@D$P
糕。这是Windows开发者经常遇到的“DLL地狱”。强名称可以解决这个问题。当CLR加载强名称程序集时51Testing软件测试网'G;\ Yd)cX
,它会将程序集中的版本号同应用程序加载的版本号进行对照(该信息被记录在模块的元数据当中)如
e,khu C#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
r1xDpw~6v(n)Mx3B0操作程序集听起来很复杂,当然,又些时候是这样,幸运的是,如果不需要创建共享程序集或者链接到
U+fRT B/F1d0其他程序集(除了FCL之外,它是一组共享程序集)的程序集,大部分关于命名和绑定的问题就不需要51Testing软件测试网{AF2~!h1v
考虑。你所做的是启动编译器,把程序集复制到指定目录,然后运行。51Testing软件测试网/d\%mX%Wy!N0F }

iY&YvnZA kA4o0基本概念51Testing软件测试网]B9F9\hN C
51Testing软件测试网 p#B7B^x.wojo1G4P}
托管模块(Managed Module)51Testing软件测试网WE EL"D5I

/H5wph gE8sT,R0托管模块是一个需要CLR才能执行的标准Windows可移植可执行(portable executable,简称PE)文件。51Testing软件测试网)F$xV:|)?yDv
51Testing软件测试网0|]Z3LNC!`
元数据(Metadata)
6H.Q)fP[c @,jq0
e0gg2D9?PE0简单的讲,元数据就是一个数据表的集合,在这些表中,其中一些用于描述托管模块中所定义的内容(比如所定义的类型和它们的成员),另外还有一些用于描述托管模块中所引用的内容(比如被引用的类型和它们的成员)。
4n3Y?7H2C0
;P-xm]KKqQ R0URL: ms-help://MS.MSDNQTR.2004APR.1033/cpguide/html/cpconmetadataoverview.htm51Testing软件测试网cv9?m~t$LS s
51Testing软件测试网6C i#f8fN
程序集清单(Assembly Manifest)51Testing软件测试网4Q Cg3]Y`+?s
51Testing软件测试网#o.W2Z;}l9iziJD
程序集清单是另外一些元数据表的集合。这些表描述了组成程序集的文件,程序集所有文件中实现的公有导出类型,以及一些程序集相关的资源文件或数据文件。
2^4FB:H]U0
.}|M|#FC[T0ms-help://MS.MSDNQTR.2004APR.1033/cpguide/html/cpconAssemblyManifest.htm
\um y,t&S]_$? f051Testing软件测试网#Oqb5La4|xv4x\8M
51Testing软件测试网/Z9p3mC3D
1.程序集(Assembly)的概念:51Testing软件测试网Z.P5th#N%h h&t

fy]@'D)\0首先:程序集是一个或多个托管模块,以及一些资源文件的逻辑组合。因为它是一个逻辑上的组合,所以程序集的逻辑表示和物理表示可以相互分离。如何将代码和资源划分到不同的文件中完全取决于我们。例如,我们可以将一些很少使用的类型或资源放在一个单独的Assembly Module中,然后根据需要(比如第一次用到的时候),从web上下载它们。如果没有用到,它们将不会被下载。这样既节省磁盘空间,也减少了安装时间。程序集允许我们将文件的部署分解开来,同时又将所有的文件看作一个单独的集合。51Testing软件测试网^:XflX't+wa

g%T dK l1]2S0    其次:因为CLR是直接和程序集打交道的,所以程序集也是组件复用,以及实施安全策略和版本策略的最小单元(安全策略,版本信息等都只能是加在程序集上)。51Testing软件测试网2w0yH u&s c1t"Z;\#w x*_
51Testing软件测试网,ya.y'C4z(Di1Lj
注意:程序集是一个逻辑组合,它可以包含很多个文件。大多数程序集(比如使用Visual Studio.NET创建的那些)一般都是单文件程序集,也就是只有一个.exe或者.dll文件(目前.NET的程序集只有这两种格式)。在这种情况下,程序集清单(manifest)直接嵌入到单文件程序集中。但是,你也可以用“程序集生成工具”(Al.exe)来创建多文件程序集。也可以只创建一个只包含清单的程序集。 51Testing软件测试网f i"I ] y-X8GZ3^.c

b8T[o+r*oF2?051Testing软件测试网/[4w5E"m"^l*e*Z
2.强命名程序集(Strong Name Assembly)的概念
$m B(XWM-upzA4Y-n0
4]G'`pa$N s0因为不同的公司可能会开发出有相同名字的程序集来,如果这些程序集都被复制到同一个相同的目录下,最后一个安装的程序集将会代替前面的程序集。这就是著名的Windows “DLL Hell”出现的原因。51Testing软件测试网eXV&}IZz
51Testing软件测试网K&lVJv
很明显,简单的用文件名来区分程序集是不够的,CLR需要支持某种机制来唯一的标识一个程序集。这就是所谓的强命名程序集。
]:K^*N.\Ia w051Testing软件测试网ScLY&d$U
一个强命名程序集包含四个唯一标志程序集的特性:文件名(没有扩展名),版本号,语言文化信息(如果有的话),公有秘钥。
%a&y!f6V6u!l5{0
[HU r~yd`0这些信息存储在程序集的清单(manifest)中。清单包含了程序集的元数据,并嵌入在程序集的某个文件中。
&oO&| ]"l3~0
4?H`8MT*V&u-o0下面的字符串标识了四个不同的程序集文件:
+i8o+wJ4YA\051Testing软件测试网 E Lc xkJ|4pU
“MyType, Version=1.0.1.0, Culture=neutral, PublicKeyToken=bf5779af662fc055”51Testing软件测试网7U*yN8WW@R

%U*Js$e7^#G&dl0“MyType, Version=1.0.1.0, Culture=en-us, PublicKeyToken=bf5779af662fc055”51Testing软件测试网XCRm#wk'|p.[
51Testing软件测试网#b/Z1w"l*O~D~r"h
“MyType, Version=1.0.2.0, Culture=neturl, PublicKeyToken=bf5779af662fc055”
EIB^4_0k0
Q @;b;SD#\ oJ0“MyType, Version=1.0.2.0, Culture=neutral, PublicKeyToken=dbe4120289f9fd8a”51Testing软件测试网!C1Cf(h_@3r [N _
51Testing软件测试网 `o3m)u[MbO
如果一个公司想唯一的标识它的程序集,那么它必须首先获取一个公钥/私钥对,然后将共有秘钥和程序集相关联。不存在两个两个公司有同样的公钥/私钥对的情况,正是这种区分使得我们可以创建有着相同名称,版本和语言文化信息的程序集,而不引起任何冲突。51Testing软件测试网*d.R"X wH]rK
51Testing软件测试网e:iv ia Ru
51Testing软件测试网9i3C F6q6uz$|
    与强命名程序集对应的就是所谓的弱命名程序集。(其实就是普通的没有被强命名的程序集)。两种程序集在结构上是相同的。都使用相同的PE文件格式,PE表头,CLR表头,元数据,以及清单(manifest)。二者之间真正的区别在于:强命名程序集有一个发布者的公钥/私钥对签名,其中的公钥/私钥对唯一的标识了程序集的发布者。利用公钥/私钥对,我们可以对程序集进行唯一性识别、实施安全策略和版本控制策略,这种唯一标识程序集的能力使得应用程序在试图绑定一个强命名程序集时,CLR能够实施某些“已确知安全”的策略(比如只信任某个公司的程序集)。51Testing软件测试网i bh{*k:{S,oL

d7u6k S9~~)qb0
2Vd{L}"{03. 如何创建强命名程序集(Strong Name Assembly)
w'L.i*{4?}?,m#Y051Testing软件测试网!Ed-nx6U1z
创建一个强命名程序集首先需要获得一个用强命名实用工具(Strong Name Utility,即SN.exe,.NET SDK自带)产生的密钥。51Testing软件测试网'[zx pB6`
51Testing软件测试网+t'KnV]ji~A
下面简要介绍一下SN.exe的一些用法。51Testing软件测试网r7WEuC*H0T(R

D&{Uu/ycy0要产生一个公钥/私钥对:51Testing软件测试网 r1]C*[)z

U A9F][9Z0s2|0a) SN –k MyCompany.Keys
3QG)vVb l:~ c051Testing软件测试网)A0TO-_tr
该命名告诉SN.exe创建一个名为MyCompany.keys的文件。MyCompany.keys文件将包含以对以二进制格式存储的公有密钥和私有密钥。51Testing软件测试网.P&]A o1\1DY

UjG*K6ic3HW:p0b)查看公有密钥:51Testing软件测试网Y1pOvD'T"R

%`k_*dz @0首先生成一个只包含公有密钥的文件:51Testing软件测试网;M DE-hV#c M VPr

2zgwb{L3D0SN –p MyCompany.keys MyCompany.PublicKey51Testing软件测试网 W1p2a0I5K%Q;{ KV
51Testing软件测试网tT l%oIk C"r6d5PH
然后用-tp参数查看:SN –tp MyCompany.PublicKeys
r'A@}*W[,s4L6x051Testing软件测试网 niv1s` X ?
Public key is51Testing软件测试网'Rs_%PaTX

;W)\ GBW2s:i2GK2s!k6z J00024000004800000940000000602000000240000525341310004000001000100bb7214723ffc1351Testing软件测试网 O+^cV'DH
51Testing软件测试网 {%f4G n uk}g+M
901343df4b9c464ebf7ef4312b0ae4d31db04a99673e8163768cc0a2a7062e731dbeb83b869f0551Testing软件测试网8a5Dqsera

'L^L"y8h pe0Z009bf8009e90db5c8728e840e782d2cf928dae35c2578ec55f0d11665a30b37f8636c08789976d851Testing软件测试网0v2w"Nn2dL$A
51Testing软件测试网@1Q@8I~btOH
ee9fe9a5c4a0435f0821738e51d6bdd6e6711a5acb620018658cce93df37d7e85f9a0104a5845051Testing软件测试网7r OmtS0zp.I}4]
51Testing软件测试网 Sr`tR7U.g8?
53995ce8
Nub/cqPT3h0
e)u;? l_051Testing软件测试网(ReT)l'{z1}P3L
Public key token is 2dc940d5439468c251Testing软件测试网OT{o,[

)Z*ap:?(vF0创建好了公钥/私钥对,创建强命名程序集就很容易了。只需要把System.Reflection.AssemblyKeyFileAttribute特性加入到源代码中就可以了: [assembly:AssemblyKeyFile("MyCompany.keys")]
l-I7X2AK(N]051Testing软件测试网QA:l7fD9m(z

9I9N1n(u0|g;Z0说明:公钥/私钥对文件的扩展名可以是任意的(也可以没有),因为编译的时候都是以元数据的格式读取的。51Testing软件测试网 XA9LZ.r
51Testing软件测试网V|8a5Oi#Fn#~ND
51Testing软件测试网2\KZP0s[b4r
4. 程序集的部署方式51Testing软件测试网lV9m;U8L$C

;qws1cR.Gp&Sy4v0一个程序集有两种部署方式:51Testing软件测试网eH0^pL-aP

1UwtH*R?%m0a) 私有方式
?{9~9j `b L]051Testing软件测试网!k}%Zj D$]0i-AT(Ej.?
和应用程序部署在同一目录下的程序集称作私有部署程序集。弱命名程序集只能进行私有部署。
c Q Y"Z/b^,c;}0
nDL$wQx[_0b)全局方式51Testing软件测试网%F8O$S`&SE

6z8_H*KNll0全局部署方式将程序集部署在一些CLR已确知的地方,当CLR搜索程序集时,它会知道到这些地方去找。强命名程序集既可以进行私有部署,也可以进行全局部署。51Testing软件测试网/tc)_7aa0M

zC"g+Y5R |0

程序集种类
是否可以进行私有部署
是否可以进行全局部署
普通程序集
强命名程序集
51Testing软件测试网Oh.x"`~@A

51Testing软件测试网;c jr%sF#c RO}

5.如何部署强命名程序集(Strong Name Assembly)和GAC
L(QG)nDN051Testing软件测试网e{+C6o`
a)GAC的概念
g+gi)Qk+u!U$V_$? ~^0
x{|{A&G@R9J0如果一个Assembly要被多个应用程序访问,那么他就必须放在一个CLR已确知的目录下,并且CLR在探测到有对该Assembly的引用时,它必须能自动到该目录下寻找这个程序集。这个已确知的目录称作GAC(Global Assembly Cache),就是全局程序集缓存。它一般位于下面的目录下::\Windows\Assembly\GAC。
/\5_4d(@9zh0
C0S` Y4NAd'{0GAC的作用就是提供给CLR一个已知的确定的目录去寻找引用的程序集。
Gqf0T ?+\:i z P0
? A,A+D n9~{@0
6l_F$tV[-m0b) GAC的内部结构
[ooNy+X0
\ L3m0P l CK}DE4@0GAC是一个特殊的结构化的目录,用Windows Explorer浏览你会以为它只是一个包含很多程序集的普通目录。其实不是这样的,在命令行下查看,你会发现它实际上包含很多子目录,子目录的名字和程序集的名称是相同的,但它们都不是实际的程序集,实际的程序集位于程序集名对应的目录下。比如进入GCFWK子目录,我们会发现其中又有很多的子目录。51Testing软件测试网/X ds&pyT)s5le
51Testing软件测试网"Y8Q }2B[9QT9}uP
51Testing软件测试网3VM$|8wn#N7i

51Testing软件测试网 f$V%jVl5wh6c

机器内每一个安装到GAC的GCFWK.dll在GCFWK中都会有一个子目录。这里只有一个目录表明只有一个版本的GCFWK程序集被安装。实际的程序集保存在每一个对应的版本目录下。目录的名称以下划线的形式分割为“(Version)_(Culture)_(PublicKeyToken)”。51Testing软件测试网4Btn"^;s z
51Testing软件测试网8t6uX-qX
GCFWK的语言文化信息为netture,就表示为1.0.0.0__bf5779af662fc055”。51Testing软件测试网W9gz2ND
51Testing软件测试网7s q~6mbh
表示得意义是:
8Z8};[~[/R:u5i0
!t'YBi3g0“GCFWK, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bf5779af662fc055”51Testing软件测试网 y*W,n*`_K ^ `*r2h
51Testing软件测试网a:d-J!cb t|)E
如果语言文化信息为”ja”,就表示为”1.0.0.0_ja_bf5779af662fc055”51Testing软件测试网E^WOiZF/L/ee
51Testing软件测试网2EPle?r$f
表示得意义是:51Testing软件测试网5nGYuNB
51Testing软件测试网'RusRy9k
“GCFWK, Version=1.0.0.0, Culture=ja, PublicKeyToken=bf5779af662fc055”
H q4xa"A6TG!W}051Testing软件测试网 [r-hhm2d`:Z}
?c)部署强命名程序集到GAC51Testing软件测试网 ug \+u+I/S.t8Gi
51Testing软件测试网 x'cs$Eol [F
GAC包含很多子目录,这些子目录是用一种算法来产生的,我们最好不要手动将程序集拷贝到GAC中,相反,我们应使用工具来完成这样的工作。因为这些工具知道GAC的内部结构J
v8f ePi051Testing软件测试网"{'vOUKQ
在开发和测试中,最常用的工具就是GACUtil.exe。
WO!d8B*^H/M D051Testing软件测试网f3C^] mb"I
在GAC中注册程序集跟COM注册差不多,但相对更容易:51Testing软件测试网-B'Z!A RD

:p5\h9cj7Q6c01.把程序集添加到GAC中:51Testing软件测试网*r,m3S V"Vj Qd!R
GACUtil /i sample.dll
RCkDt.X-p0(参数/i是安装的意思)51Testing软件测试网%eo%~ }VS

/U~PfX/`r)X02.把程序集移出GAC
%gGz Cp#ZO0
1RSQ)H,eqie$n0GACUtil /u sample.dll
T_*q| ~ q(],j0(参数/u就移除的意思)
/F g%h5{Kl051Testing软件测试网qp&N3v2oXxZ
注意:不能将一个弱命名程序集安装到GAC中。51Testing软件测试网"j*HD:o"Rz
51Testing软件测试网;e F;B%TFWJv0Z3lJ
如果你试图把弱命名程序集加入到GAC中,会收到错误信息:” Failure adding assembly to the cache: Attempt to install an assembly without a strong name”
m_2x+H%t0
2j!B*Q1Q\8z4w4nWh051Testing软件测试网%{}2A {uu;I3[H
d) 强命名程序集的私有部署51Testing软件测试网q/C9no,k+[,do
51Testing软件测试网"oO'a;O,i Gv
把程序集安装到GAC有几个好处。首先,GAC使得很多程序可以共享程序集,这从整体上减少了使用的物理内存;其次,我们很容易将一个新版的程序集部署到GAC中,并通过一种发布者策略(差不多就是一种重定向方法,比如将原来引用版本为1.0.0.0程序集的程序,通过更改它的配置文件,转而让程序去引用版本为2.0.0.0的程序集)来使用新版本;最后,GAC还提供了对不同版本程序集的并存(side-by-side)管理方式。但是,GAC的安全策略通常只允许管理员更改,同时,向GAC中安装程序集也破坏了.NET框架的简单拷贝部署的许诺。51Testing软件测试网 v;~y4X,} }Xu:[%n \

(U1n$nr/C R!z)X hl0除了向GAC或者以私有部署方式部署强命名程序集之外,我们还可以将强命名程序集部署在仅为一小部分程序知道的某个任意目录下。配置每一个应用程序的XML配置文件,让它们指向一个公有目录,这样,在运行时,CLR将知道到哪里去找这个强命名程序集。但这样又有可能会引发”DLL Hell”的问题,因为没有哪个程序可以控制这个程序集何时被卸载。这在.NET中也是不被鼓励的。51Testing软件测试网5td U-O"~0_
51Testing软件测试网E3zhce

6` Ya/p&I-IG06.并行执行(Side - By - Side)
2l!r!UT qw^tI051Testing软件测试网F/B!|&l`
这里是一个强命名程序集的例子:
c2`9vF z;n,V?051Testing软件测试网c)p!b"u!V,s#J
首先有一个App.exe程序集,它绑定这一个版本为2.0.0.0的Calculus.dll程序集和一个版本为3.0.0.0的AdvMath.dll程序集。而AdvMath.dll程序集同时又绑定着一个版本为1.0.0.0的Calculus.dll的程序集。如下图:
'X+zwa7o%pE;A:e\0
1a-J*n7Pn$\X0

/Tbmq"XN0`051Testing软件测试网#ab0a#c9F(pX0p

An application that requires different versions of the Calculus.dll assembly
i.ksW-Sy3|8xI0
V `1h_6szt`Z2Z0    CLR能够将名程相同但路径不同的多个文件加载到同一个地址空间,这在.NET中称为并存执行(Side-By-Side)执行,它是解决Windows中”DLL Hole”问题的关键技术
1F)R'K|8IW051Testing软件测试网q I.I+h/Q5q;T(g;Kn R
   如.NET Framework 1.0 和.NET Framework 1.1都可以同是在一台机器上运行,这用到的就是并存执行(Side-By-Side)执行。
}2J4K n*u.i9r w,a9Z051Testing软件测试网^WC9tjR
更多参考:
O],fq_s9Vv051Testing软件测试网)`cT4DlP
ms-help://MS.MSDNQTR.2004APR.1033/cpguide/html/cpconSide-by-SideExecutionTop.htm51Testing软件测试网:fB?0RYE l [%c T

7_Nr#NAH2L Y0http://www.microsoft.com/china/msdn/archives/library/dnnetdep/html/sidexsidenet.asp
Rpf/Upu051Testing软件测试网EgDmN

Xg'W3Fn2| k07. CLR如何解析类型引用
Lt+l m Rk0[S;v0
F ^;rJ4Q,f K.a.a0CLR在解析一个被引用的类型时,它可以在以下三个地方的其中之一找到该类型:51Testing软件测试网[o N'y+}&~:a X:tv

b0C7}D9j$Z e*n.n s0· 同一个文件
5v4w)|U3P1yV)J051Testing软件测试网 K)S)BA Sv
对同一个文件中类型的访问在编译时就已经确定下来了,CRL直接从该文件中加载被引用的类型。完成加载后,程序将继续运行。
_&uO ` a F4HPK0
v;Or:~|XZl0·不同的文件,相同的程序集
PWF"O O/L1z051Testing软件测试网[sfbJ*J
CLR首先确保被引用的文件在当前程序集清单中的FileDef表内。CLR然后会在加载程序集清单文件的目录中查找被引用的文件。该文件被加载的同时,CLR会检查它的散列值以确保文件的完整性,之后便会找到相应的类型成员。完成加载后,程序将继续运行。
}5s7Mg'Q QpZ051Testing软件测试网N!eP.v8_)c?
·不同的文件,不同的程序集51Testing软件测试网V f)@S Ou m"Z

C.lQ:_+f \AId2^0当被引用的程序集在一个不同的程序集文件中时,CLR会首先加载包含被引用程序集的清单所在的文件。如果该文件没有包含所需要的类型,CLR会根据此清单文件加载适当的文件。这样也会找到相应类型的成员。完成加载后,程序将继续运行。
7E+F-t%|3`&j0
)}4@"pVZw0       如果在解析类型引用的过程中出现任何错误,比如文件找不到,文件不能被加载,散列值不匹配等等,系统将会抛出相应的异常。51Testing软件测试网 T1j H%Pg4^ t$\$~
51Testing软件测试网%K'wE\'E%w1WF
下图演示了类型的绑定过程:51Testing软件测试网(\.sO|%BS+Wi
51Testing软件测试网;s#UJ+SF4g
51Testing软件测试网 @M6^9wrqp

51Testing软件测试网0z(D9K9a$?*S c

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

9\2Q6r)bO0
51Testing软件测试网 T f l8H L V I*`

 51Testing软件测试网"k9w)q9N*Xr MK


TAG: assembly CLR GAC 软件开发相关

 

评分:0

我来说两句

日历

« 2024-04-09  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

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

RSS订阅

Open Toolbar