CSDN博客

img flycatcq

assembly程序集

发表于2004/6/26 1:19:00  1093人阅读

assembly是构成一个逻辑单元的一个或多个文件的集合。在这里的“文件”通常是指托管模块,但程序
集也能包含其他的文件。大部分程序集只包含一个文件,但是程序集能够而且有时确实包含多个文件。
组成多个文件程序集的所有文件必须位于相同的目录下。当使用C#编译器生成简单的EXE文件时,这个
EXE文件时,这个EXE文件不仅仅是托管模块,它同时也是程序集。大多数编译器可以生成非程序集的模
块,也能够向自己创建的程序集添加其他文件。.net框架SDK还提供了一个名为AL(程序集连接器)的
工具,它可以将文件联接成程序集。

多文件程序集通常用于将用不同语言编写的模块相结合,或将托管模块同包含JPEG或其他资源的普通文
件相结合。多文件程序集还被用来将应用程序划分为可下载的单元,这对部署在Internet上的代码十分
有用。

CLR是如何知道那些文件属于一个程序集?在程序集中的一个文件中包含一个清单(manifest)从物理角
度,清单只是增加的元数据;当编译器生成托管模块,而该托管模块又碰巧是程序集的时候,它将清单写
入模块的元数据之内。从逻辑的角度而言,清单是程序集内容的路径图。它最重要的元素有以下几种
程序集的名称
程序集中其他文件的列表
从程序集的其他文件中导出的数据类型的列表,和将这些数据类型映射到定义它们的文件的信息
版本号,格式为:主版本号.次版本号.内部版本号.修订号

清单还包括其他信息,例如公司名称、描述、安全许可和区域性字符串。后者对程序集的目标国别进行
界定(如en-US 表示美式英语)并且通常与所谓的“附属程序集”一起使用。描述一个由3个托管模块
和一个JPEG文件组成的多文件程序集。Main.exe文件包含清单,清单包括对其他文件的引用。从文件系
统角度考虑,这些文件仍然是独立的文件。但是对于CLR,它们是一个逻辑实体。

如果缺少指示程序集要完成什么操作信息,编译器默认生成弱名称的程序集。“弱名称”意味着程序没
有经过加密签名,CLR只使用程序集清单中存储的名称(不包括扩展名的程序集文件名)表示程序集。但
程序集可以具有强名称。强名称程序集包含出版者的公匙和数字签名(公匙所在的程序集清单的散列)

数字签名通过出版者私匙生成并由公匙确认。强名称程序集的表示源于程序集名称、公匙、版本号和区
域性字符串。不论多小的差异,都足以区别两个不同的程序集。

SDK的AL实用工具能用来创建强名称程序集。大多数语言编译器,包括C#和Visual Basic .NET编译器
,也能创建强名称程序集。是部署弱名称程序集还是强名称程序集取决于你,你可以根据程序集的目标
应用来确定。如果要将程序集部署在全局程序集缓存GAC中——放置可供多个应用程序公享的程序集的
全局仓库,那么一定要使用强名称程序集。

如果希望进行版本检查,也需要对程序集使用强名称。当CLR加载弱名称的程序集时,它不进行版本检查
——当你用新版本替换旧版本的程序集(也许新版本修订了旧版本中的某些错误时,并且希望使用该程
序的应用程序集的应用程序能够自动使用更新的程序集,这一点很有利。但是,当你针对某个版本的程
序集仔细地测试了应用程序后,有人又用某个可能存在缺陷的程序集替换了旧版本的程序集,这样很糟
糕。这是Windows开发者经常遇到的“DLL地狱”。强名称可以解决这个问题。当CLR加载强名称程序集时
,它会将程序集中的版本号同应用程序加载的版本号进行对照(该信息被记录在模块的元数据当中)如
果版本号不匹配,CLR会引发异常

当然严格的版本检查也有它自己的缺陷。如果你决定使用强名称,但后来在程序集中发现一个错误。你
更正了错误并部署已修正的程序集。但是,使用该程序集的应用程序不加载新版本的程序集,除非你重
建应用程序。而且如果你删除旧版本,应用程序根本就不运行。解决方法是修改CLR绑定策略。管理员
可以通过编辑配置文件将CLR指向新版本的强名称程序集。当然,如果新版本有问题,你就又碰上了麻
烦了,这就是为什么不要随便授予别人管理员特权。

操作程序集听起来很复杂,当然,又些时候是这样,幸运的是,如果不需要创建共享程序集或者链接到
其他程序集(除了FCL之外,它是一组共享程序集)的程序集,大部分关于命名和绑定的问题就不需要
考虑。你所做的是启动编译器,把程序集复制到指定目录,然后运行。

0 0

相关博文

我的热门文章

img
取 消
img