microsoft® .net 框架介绍了几个新功能,旨在简化应用程序发布和解决 dll hell。最终用户和开发人员都熟悉版本和发布问题,这些问题会伴随着如今基于组件的系统一同出现。例如,每个最终用户都在他们的机器上安装了一个新的应用程序,没料到已有应用程序神秘地停止了工作。多数开发人员花费时间使用 regedit,努力保持所有必要的注册项一致以便激活 com 类。
.net 框架中用于解决 dll hell 问题的设计原则和实现技术是建立在 microsoft windows® 2000 的基础上的, rick anderson 所著的 the end of dll hell(英文)和 david d'souza, bj whalen 及 peter wilson 所著的 implementing side-by-side component sharing in applications (expanded) (英文)中都有说明。.net 框架提供的许多功能都在这两篇文章中有所描述,包括应用程序隔离和并行组件,用于建立在 .net 平台的应用程序。您将了解 .net 平台上提供的版本支持,它能使本地 windows 应用程序更紧密地汇集。
很难建立一个隔离应用程序的一个原因是当前运行时环境只允许单独版本组件或应用程序的安装。这个限制意味着组件的编写者必须以向后兼容的方式编写他们的代码,否则当他们安装新组件的时候会有终止已有应用程序的风险。实际上,如果可能的话,编写永远向后兼容的代码是非常难的。在 .net 中,side by side 概念是版本问题的核心。"side by side" 是在同一台机器上同时运行不同版本的相同组件的能力。使用支持并列的组件,编程人员不必努力维护严格的向后兼容,因为不同的应用程序自由使用某个共享组件的不同版本。
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 表格控件的副本是没有意义的。