微软Windows应用程序经常受到动态链接库的拖累,这就是“DLL地狱”问题,在遇到此类麻烦的时候,应用程序的某一个组件会被其他应用程序的不兼容组件覆盖,结果令受到干扰的应用程序完全不能正确工作。这些问题很难诊断出来,因为它们只有在问题组件安装一段时间之后才会突然冒出来。Visual Basic应用程序的DLL地狱问题更是臭名昭著,因为用Visual Basic语言开发的应用程序相比其他编程语言开发的应用程序具有更大程度的外部相关性。微软推出的.NET计划有望采用一种新型的分布单元assembly(装配)来缓和这一严重问题。

assembly机制初探

从编程的角度来看,一个assembly在功能上等同于Java包:它提供了相关类的可分配库而且定义了它们的范围。对那些不熟悉Java的人来说,在开发应用程序的时候,assembly之于.NET无异于DLL文件之于COM,只不过assembly由多个文件所组成。

Assembly可以通过所谓的名单(manifest)实现自我文档化,这也是它们相比DLL更为优异的一个典型特征。名单包含在assembly之内,由说明assembly的导出类的元数据、这些类所需的外部依附、使用assembly所需的权限以及此类依附的版本控制信息所组成。在.NET框架内,assembly为版本、类以及不能版本化的单个文件提供了公共名称。这样就可以不必检查多个文件以确定系统上安装组件的版本,这也正是我们以往最感到气恼的地方。.NET的这种版本控制特性几乎可以完全消除DLL地狱病。

私有assembly和公共assembly

在缺省的情况下,.NET的assembly是私有的,这意味着它们仅能被某一个应用程序所用。私有的assembly应当被安装到应用程序所在的文件夹或其子文件夹之一。微软希望大多数 .NET开发人员能采用私有的assembly,而事实上它也在鼓励人们这样做。

但是,这样会带来一个潜在的问题:用户的硬盘内可能因为拥有同一私有assembly的多重拷贝而变得混乱不堪,这真是很具有讽刺意味,听起来反倒是COM好象更容易解决这个问题了。微软则是这样回应以上批评的:“硬盘很便宜,买个更大的就行了。”幸好,你可以非常方便地把私有的assembly转为公共assembly,甚至不必重新编译或编辑代码。

共享之美

共享assembly和私有assembly之间的主要差别在于前者通常保存在专门命名的全局装配缓存(简称GAC)内。GAC有时在微软文档中被称为Global Assembly Store,可能是因为后者简称起来好听一些。

GAC能存储同一assembly的多个版本,这就是微软所称的“肩并肩部署”功能。这一功能几乎消除了安装应用程序的不兼容共享组件而影响其他应用程序的可能性,这对开发者来说肯定是个好消息。

客户assembly能指定它兼容哪个或者那些共享assembly的版本。如果客户程序的版本要求不能被满足,那么.NET运行时就不会装载任何服务器assembly。顺便说一句,.NET的assembly版本由4位数字格式表示,形式如:主版本号.次版本号.创建版本号.修订版本号。

默认地。一个assembly被认为只能兼容具有同样主版本和次版本号的共享assembly。然而运行时装载器却优先装载相比客户版本具有更高创建版本号或者修订版本号的assembly,如果存在这样的assembly,就会自动地为其提供修补支持。这种缺省行为并不一定总是你所希望的,因此程序员或系统管理员可以定义定制的版本控制策略,比方说,强迫装载某一特定的版本或者禁用装载器对更高创建版本号或者修订版本号的assembly的装载。

在Beta 1版上,版本控制策略包含在一些XML文件内,而这些文件则要不驻留在应用程序目录下要不就保存在Windows目录下。这些XML文件分别定义了同特定软件相关的版本策略以及系统范围内的版本控制策略。

命名

你可以随意命名私有的assembly,只要其名称在应用程序内唯一即可。另一方面,公共assembly则需要采用某种全局唯一标识符以便.NET运行时可以识别它们。COM的Class ID和Prog ID已经随风而逝了。现在的共享assembly采用了所谓的strong name命名机制。Strong name来源于标准的公钥加密算法。开发人员用一个私钥“签署”assembly同时提供一个公钥供客户assembly使用。公钥随后成为assembly的strong name的一部分。

采用命令行编译器签署assembly需要使用一些命令行指令选项,因此这也是一项比较繁重的任务。幸好,Visual Studio.NET可以自动地为程序员完成这些工作。

小小装配做大事

微软最后还是承认了DLL地狱问题的存在,而且意识到这一问题只能通过操作系统级施加控制策略才能得以弥补。在注册表和对COM应用程序单个组件支持这方面瞎折腾一气之后,看起来好象微软已经走上了正途。事实上,有了assembly机制,安装.NET应用程序完全可能变成使用Xcopy命令拷贝程序那么简单!

转载于:https://www.cnblogs.com/softwareking/archive/2011/03/06/1972557.html

Assembly介绍相关推荐

  1. Assembly介绍及使用

    什么是Assembly(程序集)? Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合.在.net框架中通过Assembly类来支持,该类位于System ...

  2. C# 反射类Assembly用法举例

    概述 程序运行时,通过反射可以得到其它程序集或者自己程序集代码的各种信息,包括类.函数.变量等来实例化它们,执行它们,操作它们,实际上就是获取程序在内存中的映像,然后基于这个映像进行各种操作. Ass ...

  3. mysql integrityerror_mysql插入数据报错IntegrityError: (1062, Duplicate entry 'xx' for key 'xxxxx')...

    1.问题描述 MySQL插入数据的时候报错,提示如下: IntegrityError: (1062, "Duplicate entry 'xx' for key 'xxxxx'") ...

  4. layer ajax返回成功 关闭窗口,layer.msg()自动关闭后刷新页面

    nginx upstream的几种配备方式 nginx upstream的几种配置方式 nginx 的upstream目前支持4种方式的分配 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服 ...

  5. Business Insider点评2011年最佳创业公司20强

    北京时间12月6日消息,据国外媒体报道,国外科技圈内点评了2011年最佳创业公司20强.以下是Business Insider对这20家最佳创业公司的点评. Simple 一款帮助去除银行年费的全新的 ...

  6. C#反射之Assembly.Load,Assembly.LoadFile 与 Assembly.LoadFrom方法介绍

    一些关于C#反射的知识,估计也就最多达到使用API的程度,至于要深入了解,以现在的水平估计很难做到,所以下面此篇文章,以作为一个阶段的总结. 对于反射的总结,我想从以下几个方面展开,首先是反射程序集, ...

  7. Maven Assembly插件 使用与标签介绍

    Maven Assembly插件 使用与标签介绍 一.介绍 Assembly 插件的主要作用是,允许用户将项目输出与它的依赖项.模块.站点文档.和其他文件一起组装成一个可分发的归档文件. 二.常见的m ...

  8. Maven Assembly插件介绍

    你是否想要创建一个包含脚本.配置文件以及所有运行时所依赖的元素(jar)Assembly插件能帮你构建一个完整的发布包. Assembly插件会生成 "assemblies", 此 ...

  9. Assembly学习心得

    http://blog.csdn.net/etmonitor/ Assembly学习心得 说明: 最近开始准备把学到的.NET知识重新整理一遍,眼过千遍不如手过一遍,所以我准备记下我的学习心得,已备参 ...

最新文章

  1. c#操作Word文件 导出数据到word文档 (table 书签方式)
  2. Dijkstra算法的c++实现
  3. MySQL事务效率测试
  4. try catch 有多烦人,我就有多暴躁!一次搞定 Exception ^ ^
  5. rejection from Cambridge Machine Learning and Machine Intelligence MPhil
  6. 华为android9.0升级,华为官方更新消息:这几款手机9月5日分批推送安卓9.0系统升级...
  7. vscode快捷键:多行同时输入
  8. Java 验证二代身份证号码是否正确
  9. 从IP盗窃知悉:你的知识产权如何被盗?
  10. NYOJ 90整数划分
  11. 使用阿里云服务来部署云桌面
  12. -Xms -Xmx -Xmn -Xss 核心总结
  13. Source must not be null\n\tat org.springframework.util.Assert.notNull(Assert.java:101)
  14. DMA驱动框架流程编写
  15. UDP 头部结构及协议特点
  16. c语言中ctod语句的作用,CTOD(c语言ctod函数)
  17. canvas 实现流星雨特效
  18. nb信号和4g信号_NB-IoT的同步信号解析
  19. python爬虫抓取千千音乐网站的歌曲
  20. Python正则匹配中文与编码总结

热门文章

  1. PAT (Basic Level) Practice (中文)1016 部分A+B (15 分)
  2. GAN网络图像翻译机:图像复原、模糊变清晰、素描变彩图
  3. Linux centos添加源+网易163源+搜狐源
  4. Python中的十六进制数
  5. Vue3 (Vscode插件)
  6. 池化技术-数据库连接池
  7. rocketmq分布式事务最终一致性解决方案
  8. python生成二维码代码_python 一行代码生成 二维码
  9. 语音合成论文优选:Efficiently Trainable Text-to-Speech System Based on Deep Convolutional Networks with Guide
  10. 怎么优化网站首页+seo排名方案