assembly程序集

原创 2004年06月26日 01:19:00

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之外,它是一组共享程序集)的程序集,大部分关于命名和绑定的问题就不需要
考虑。你所做的是启动编译器,把程序集复制到指定目录,然后运行。

C#程序集Assembly学习随笔(第一版)_AX

C#程序集Assembly学习随笔(第一版)_AX ①什么是程序集? 可以把程序集简单理解为你的.NET项目在编译后生成的*.exe或*.dll文件. 嗯,这个确实简单了些,但我是这么理解的.详细:...
  • msbls5
  • msbls5
  • 2014年12月26日 09:46
  • 1958

使用Assembly来开发C#程序

什么是Assembly(程序集)? Assembly是一个包含程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。在.net 框架中通过Assembly类来支持,该类位于Syste...
  • cyongxue
  • cyongxue
  • 2013年05月18日 09:29
  • 1832

Assembly介绍及使用

什么是Assembly(程序集)? Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。在.net框架中通过Assembly类来支持,该类位于Syste...
  • u013123046
  • u013123046
  • 2014年03月19日 23:10
  • 1194

C#中使用Assembly.LoadFile()加载程序集的抛异常的问题

程序集model.dllusing System;namespace model { public class Student { public string sno ...
  • qq_34332010
  • qq_34332010
  • 2017年01月25日 10:25
  • 1100

反射 | 程序集 | Invoke

什么是程序集: 程序集是。net中的概念,net中dll和exe都是程序集,他们的区别就是exe可以直接执行(因为它有入口main函数,而dll没有,)而dll 不可以直接执行,它没有入口main函数...
  • Fanbin168
  • Fanbin168
  • 2015年05月18日 01:53
  • 1132

程序集清单(Assembly Manifest)的应用

最近在工作中碰到一个软件版本发布的问题:在本地开发了一个服务端程序,在自己的计算机上能毫无问题地运行,但是当发布出去在一个纯净的win7环境下运行无法正常加载动态库,报加载库的错误为“14001”,于...
  • xinfeiyang0605021
  • xinfeiyang0605021
  • 2015年06月29日 21:01
  • 1526

程序集版本号,文件版本号及发布版本号管理

程序集版本号:在.net框架中和CLR运行时钟引用,如使用程序集的强命名时就会使用. 按照我的理解,你所使用的库如log4net,常见的有2.0和4.0的,那么你下载的库是否是你工程中用的库,就要看...
  • u201011221
  • u201011221
  • 2016年02月22日 10:27
  • 2326

[洪流学堂]Unity2017.3新功能:程序集定义(Assembly Definition File)功能详解

本文首发于“洪流学堂”公众号。 洪流学堂,让你快人几步 Unity2017.3已经发布,其中一大新功能是:程序集定义文件(Assembly Definition File),下面文中我们就简称A...
  • zhenghongzhi6
  • zhenghongzhi6
  • 2017年12月22日 16:25
  • 217

通过应用程序域AppDomain加载和卸载程序集

在程序中需要卸载之前加载的Assembly,不知道在.Net中如何实现,在网上看到了这篇文章,感觉写的不错,在此贴出来,谢谢原创作者。 微软装配车的大门似乎只为货物装载敞开大门,却将...
  • fengjiji
  • fengjiji
  • 2014年01月02日 23:28
  • 912

关于一个嵌入dll程序集引发的血案

闲来无聊,做了个网页爬虫的程序集,
  • cuiyh1993
  • cuiyh1993
  • 2015年06月11日 23:51
  • 612
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:assembly程序集
举报原因:
原因补充:

(最多只允许输入30个字)