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 表格控件的副本是沒有意義的。