.NET框架解決DLL Hell問(wèn)題:?jiǎn)栴}描述
.NET框架與DLL Hell問(wèn)題:版本問(wèn)題
從客戶的角度,最常見(jiàn)的版本問(wèn)題就是我們所說(shuō)的 DLL Hell 問(wèn)題。簡(jiǎn)單地講, DLL Hell 是指當(dāng)多個(gè)應(yīng)用程序試圖共享一個(gè)公用組件(如某個(gè)動(dòng)態(tài)連接庫(kù)(DLL)或某個(gè)組件對(duì)象模型(COM)類(lèi))時(shí)所引發(fā)的一系列問(wèn)題。最典型的情況是,某個(gè)應(yīng)用程序?qū)⒁惭b一個(gè)新版本的共享組件,而該組件與機(jī)器上的現(xiàn)有版本不向后兼容。雖然剛安裝的應(yīng)用程序運(yùn)行正常,但原來(lái)依賴(lài)前一版本共享組件的應(yīng)用程序也許已無(wú)法再工作。在某些情況下,問(wèn)題的起因更加難以預(yù)料。比如,當(dāng)用戶瀏覽某些 Web 站點(diǎn)時(shí)會(huì)同時(shí)下載某個(gè) Microsoft ActiveX? 控件。如果下載該控件,它將替換機(jī)器上原有的任何版本的控件。如果機(jī)器上的某個(gè)應(yīng)用程序恰好使用該控件,則很可能也會(huì)停止工作。
在許多情況下,用戶需要很長(zhǎng)時(shí)間才會(huì)發(fā)現(xiàn)應(yīng)用程序已停止工作。結(jié)果往往很難記起是何時(shí)的機(jī)器變化影響到了該應(yīng)用程序。用戶可能會(huì)回憶起一周前安裝了一些東西,但安裝與目前看到的狀態(tài)并沒(méi)有任何明顯的關(guān)聯(lián)。 更糟的是,現(xiàn)在很少有診斷工具幫助用戶(或幫助他們的技術(shù)支持人員)確定有什么問(wèn)題。
這些問(wèn)題的原因是應(yīng)用程序不同組件的版本信息沒(méi)有由系統(tǒng)記錄或加強(qiáng)。而且,系統(tǒng)為某個(gè)應(yīng)用程序所做的改變會(huì)影響機(jī)器上的所有應(yīng)用程序—現(xiàn)在建立完全從變化中隔離出來(lái)的應(yīng)用程序并不容易。
很難建立一個(gè)隔離應(yīng)用程序的一個(gè)原因是當(dāng)前運(yùn)行時(shí)環(huán)境只允許單獨(dú)版本組件或應(yīng)用程序的安裝。這個(gè)限制意味著組件的編寫(xiě)者必須以向后兼容的方式編寫(xiě)他們的代碼,否則當(dāng)他們安裝新組件的時(shí)候會(huì)有終止已有應(yīng)用程序的風(fēng)險(xiǎn)。實(shí)際上,如果可能的話,編寫(xiě)永遠(yuǎn)向后兼容的代碼是非常難的。在 .NET 中,side by side 概念是版本問(wèn)題的核心。"Side by side" 是在同一臺(tái)機(jī)器上同時(shí)運(yùn)行不同版本的相同組件的能力。使用支持并列的組件,編程人員不必努力維護(hù)嚴(yán)格的向后兼容,因?yàn)椴煌膽?yīng)用程序自由使用某個(gè)共享組件的不同版本。
.NET框架與DLL Hell問(wèn)題:發(fā)布和安裝
現(xiàn)在安裝應(yīng)用程序是多步過(guò)程。一般,安裝一個(gè)應(yīng)用程序包括復(fù)制許多軟件組件到磁盤(pán),和在系統(tǒng)中進(jìn)行一系列描述那些組件的注冊(cè)項(xiàng)。
注冊(cè)表中的項(xiàng)和磁盤(pán)上文件的分隔使復(fù)制應(yīng)用程序和卸載他們非常困難。而且,在注冊(cè)表中完全描述某個(gè) COM 類(lèi)所需的許多項(xiàng)之間關(guān)系非常松散。這些項(xiàng)常常包括聯(lián)合類(lèi)、接口、類(lèi)型庫(kù)和 DCOM app ID 的項(xiàng),不涉及任何放在注冊(cè)表文檔擴(kuò)展或組件類(lèi)別的項(xiàng)。要時(shí)常手工保持這些項(xiàng)的同步。
***,需要該注冊(cè)足跡激活任何 COM 類(lèi)。這極大地復(fù)雜了發(fā)布分布式應(yīng)用程序的過(guò)程,因?yàn)楸仨毜矫總€(gè)客戶端的機(jī)器進(jìn)行適當(dāng)?shù)淖?cè)項(xiàng)。
如今另一個(gè)共同問(wèn)題是:對(duì)一個(gè)正在運(yùn)行的應(yīng)用程序進(jìn)行更新是不現(xiàn)實(shí)的。這是 Web 應(yīng)用程序***的問(wèn)題,Web 應(yīng)用程序必須停止工作然后重啟動(dòng)以更新應(yīng)用程序使用的 COM 類(lèi)。
這些問(wèn)題主要由從組件自己分離傳來(lái)的組件描述引起的。換句話說(shuō),應(yīng)用程序不是自描述的和獨(dú)立的。
以上就對(duì)需要.NET框架解決的DLL Hell問(wèn)題進(jìn)行了簡(jiǎn)單的描述。
【編輯推薦】