打印

[asp.net教程] 利用.net框架简化发布和解决dll hell问题(3 )

利用.net框架简化发布和解决dll hell问题(3 )

有几个关于这四个元素能如何包装的选项。例如,图 2 表示包含整个汇编:清单、类型元数据、il 代码和资源。
   
   
   
  图 2. 包含所有汇编元素的 dll
   
  另一种情况,一个汇编的内容也许分割为多个文件。在图 3 中,作者选择将一些有用的代码分离到一个不同的 dll 中,并在它的原始文件中保留一个大的资源文件(这里是一个 jpeg 文件)。这样做的一个原因就是优化代码的下载。.net 框架只在引用时才下载文件,所以如果汇编包含经常被访问的代码或资源,那么将他们分成单独的文件将提高下载的效率。
   
   
   
  图 3. 汇编元素分割为多个文件
  版本与共享
   
   
  dll hell 一个主要目的就是共享当前在基于组件的系统中使用的模型。默认情况下,单独的软件组件由机器上的多个应用程序共享。例如,每次一个安装程序复制一个 dll 到系统目录或在 com 注册表中注册一个类,该代码将潜在地影响其他运行在机器上的应用程序。实际上,如果一个已存在的应用程序使用共享组件的前一个版本,那么该应用程序将自动使用新版本。如果共享组件是严格向后兼容的这当然更好,但如果不可能,在许多情况下维护向后兼容是很困难的。如果没有维持向后兼容或不能维持,作为其他应用程序安装时的侧面影响经常导致应用程序中断。
   
  .net 设计方针的一个原则就是隔离组件(或汇编)。隔离一个汇编的意思是一个汇编只能由一个应用程序访问—不是由机器上的多个应用程序共享并且不可能因其他应用程序对系统的改变而影响。隔离赋予开发者对应用程序所用代码的绝对控制。隔离,或应用程序专用汇编期望在 .net 应用程序中是默认的。隔离组件的趋势在 microsoft windows 2000 中随着 .local 文件的引入已经开始。该文件用于努力定位所需组件时使 os loader 和 com 首先从应用程序目录查找。(请参阅 msdn library 中的相关文档,implementing side-by-side component sharing in applications(英文)。)
   
  然而,有些情况下在应用程序之间共享汇编是必要的。很明显每个应用程序都有自己的 system.winforms、system.asp 或公用的 web 表格控件的副本是没有意义的。
   
  在 .net 中,在应用程序之间共享代码是明确的决定。共享汇编需要一些附加的需求。特别是,共享汇编应该支持相同的汇编并排多个版本安装和运行在相同的机器上,或者甚至在相同的进程中,在相同的时间。另外,共享汇编有更严格的命名需要。例如,一个共享的汇编必须有一个全局唯一的名称。
   
  隔离和共享的需要导致我们考虑两种汇编。这是个相当松散的集合,在这两种汇编之间没有实际的结构,但它们如何使用是不同的:专用于某个应用程序或与许多应用程序共享。
   
  应用程序专用汇编
   
  应用程序专用汇编是只对某个应用程序可视的汇编。我们期望这是 .net 应用程序最普通的情况,因为 .net 框架帮助建立从其它应用程序引起的系统变化中隔离的应用程序。
   
  专用汇编的命名需求很简单:汇编名称必须在应用程序中是唯一的。没必要起全局唯一的名称。保持名称唯一不是问题因为应用程序开发者完全控制哪个汇编与应用程序隔离。
   
  应用程序专用汇编部署在使用它们的应用程序目录结构中。专用汇编可以直接放在应用程序的目录或它的子目录中。通用语言运行时间通过称为 probing 的进程查找这些汇编。"probing" 是汇编名称到包含清单的文件名称之间的简单映射。
   
  特别地,通用语言运行时间把汇编的名称记录在汇编引用中,追加“.dll” 并在应用程序的目录中查找该文件。该方案中有一些变量,在那里运行时间会访问汇编命名的子目录中或汇编的风格命名的子目录。例如,某个开发者会选择将包含定位于德国的资源的汇编部署在称为“de”的子目录中,并将西班牙的资源部署在称为“es”的子目录中。
   
  如前所述,每个汇编清单包括有关其关系的版本信息。该版本信息没有为专用汇编而加强,因为开发人员完全控制了部署到应用程序目录的汇编。
   
  共享汇编
   
  .net 框架还支持共享汇编的概念。共享汇编是在机器上由多个应用程序使用的。使用 .net,共享应用程序之间的代码是明确的决定。共享汇编有些额外的需求用于解决现在我们经历的共享问题。除了支持早先描述的并列之外,共享汇编还有许多严格的命名需求。例如,共享汇编必须有一个全局唯一的名称。而且系统必须提供“名称保护”—更确切的说,防止有人再使用编写者的汇编名称。例如,假设您是一个网格控件的厂家,并且发布了您的汇编版本 1。做为编写您需要确信没有其他人能发布声称为版本 2 的汇编或您的网格控件。.net 框架支持通过称为共享名的技术支持支持这些命名需求。(在下一节详细说明)。

TOP

返回顶部
AYBlue

Processed in 0.055551 second(s), 7 queries.

当前时区 GMT+8, 现在时间是 2009-1-10 11:36 京ICP备06054220号

清除 Cookies - 联系我们 - 163K.com - Archiver - WAP