在.NET中引用了新的概念——装配件(Assembly)。本文从根本上来分析下Assembly的前因后果。
一 为什么(WHY)
众所周知,任何东西的诞生都有其诞生的理由。那么,Assembly是为了什么出现的呢。我们知道,Assembly通过编译后,表现的也是一个dll文件。那么,它与传统的dll文件有和区别呢?
传统的dll在新程序的安装过程中,很容易被新版本所替代。因为传统的dll 主要是用来导出全局函数,它并没有相关的信息或版本设置来保证此dll 的唯一性,故在安装新的程序时,这些dll是不安全的,随时都有可能被替换。
再次之后,为了解决dll的安全问题,COM DLL被用来允许一个dll的多个版本存在。它通过重写LoadLibrary()api函数,通过路径查找相应的dll来保证不同个配置,调用对应的dll文件。但这种做法,也会带来另外的问题就是当dll被卸载的时候。当卸载两个版本中的一个时,注册表中的条目会丢失,其他的版本也不可以工作。如果不卸载,当同一个组件的两个版本使用不同的线程配置时,最后安装的版本将被使用。此问题的关键是com dll的配置信息没有绑定到dll本身。
同一个组件的不同版本能正常使用的关键问题就是,任何一个dll将其自己的版本信息等与dll一起发布,而引用这些dll的应用程序能通过具体的版本得到想用的dll而不会带来问题。这就是Assembly出现的原因。
Assembly是一种自我描叙的单元,可以由一个或多个文件组成。一个Assembly可以使包括元数据的dll或者exe,也可以由多个文件组成,如资源文件、元数据、dll和exe。
二 装配件(Assembly)的特性
1 自我描叙。
2 版本的相互依赖在清单中进行记录。引用Assembly的版本被存贮在Assembly的清单中,这样可以确切的了解在开发的过程中使用的装配件版本号。
3 可以并行加载。如果Assembly A1使用Assembly B的版本1, Assembly A2使用Assembly B的版本2,而用户同时使用Assembly A1和A2,则Assembly B的那个版本会被使用?答案是两个版本都会被调用。
4 AppDomain确保独立性。使用AppDomain,许多应用程序就可以独立地运行在一个进程中,一个应用程序的错误不会影响同一个进程中的其他的应用程序。
5 安装简单。
三 装配件(Assembly)的结构
常用结构如下: