資源描述:
《別再掉進(jìn)dll地獄的陷阱里(dll hell)~.net解決之道》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、DLL陷阱是一個(gè)惡夢(mèng),是一種相當(dāng)奇怪的問(wèn)題。相信很多讀者都有這樣的經(jīng)驗(yàn),如果你的軟體今天原本運(yùn)作順暢,當(dāng)你安裝某個(gè)新軟體之后,突然間電腦就無(wú)法運(yùn)作了。這絕對(duì)不是你的硬體有問(wèn)題,也不是應(yīng)用程序的問(wèn)題,而是作業(yè)系統(tǒng)設(shè)計(jì)上的缺失,這樣的問(wèn)題層出不窮,這通常是因?yàn)樾碌膽?yīng)用程序版本覆蓋掉共享的程序庫(kù)(DLL),而且往往修改了一些現(xiàn)存應(yīng)用程序所必需的「bug」,這個(gè)缺失有了一個(gè)名字叫做DLLHell(DLL地獄)。開(kāi)發(fā)人員與系統(tǒng)管理者(以及使用者)面臨最大的挑戰(zhàn)就是版本更新的問(wèn)題,他們花很多時(shí)間在Windows
2、登錄檔(Regedit)上試著解決其問(wèn)題而吃盡苦頭。.在Microsoft.NET的世界里,軟體元件再也不需要登錄(Registry)了!NETFramework包含了一些功能,可以實(shí)際消除「DLLHell」的問(wèn)題,一項(xiàng)稱(chēng)之為「side-by-side」開(kāi)發(fā)模式的新功能。DLL&DLLHell為什么要使用DLL(DynamicLinkingLibrary)-動(dòng)態(tài)鏈接庫(kù)?微軟當(dāng)初為Windows設(shè)計(jì)動(dòng)態(tài)鏈接庫(kù)主要是擷取它的兩項(xiàng)優(yōu)點(diǎn):一是動(dòng)態(tài)連結(jié)、一是資源共享。資源共享的例子相當(dāng)顯而易見(jiàn),例如之前曾經(jīng)提
3、過(guò)Windows有三個(gè)核心的動(dòng)態(tài)鏈接庫(kù):Kernel主要是負(fù)責(zé)系統(tǒng)和應(yīng)用程序的記憶體、行程和執(zhí)行緒等等的管理工作;User主要負(fù)責(zé)使用者介面和訊息的傳遞;GDI則負(fù)責(zé)系統(tǒng)的任何圖形繪制、顯示等工作。而這些動(dòng)態(tài)鏈接庫(kù)所提供的任何函數(shù)都可以在必要的時(shí)候,讓每一個(gè)Windows環(huán)境底下的執(zhí)行檔使用。因?yàn)镈LL具備節(jié)省記憶體的特性,因此自從Windows3.1版以來(lái),它就逐漸成為Windows程序設(shè)計(jì)的主流˙動(dòng)態(tài)鏈接庫(kù)可以資源共享許多大型軟體廠(chǎng)商的眾多軟體產(chǎn)品可能都會(huì)有許多可以共用的模組,如果每一套軟體各自
4、擁有一份這些可以共用的模組,不僅會(huì)造成磁碟空間的浪費(fèi),還會(huì)讓維護(hù)這些模組的工作變的既復(fù)雜、又凌亂。最好的方法就是僅保持一份程序碼,然后透過(guò)共享的方式讓其他自家的應(yīng)用程序也可以存取其中共用的模組。共用模組的方法之一就是將模組制作成動(dòng)態(tài)鏈接庫(kù),然后透過(guò)軟體的安裝程序復(fù)制到電腦,那么只要安裝了其中一套軟體之后,其他自家的產(chǎn)品就可以互相共用這一套動(dòng)態(tài)鏈接庫(kù)。假設(shè)有一函數(shù)庫(kù)X供三個(gè)應(yīng)用程序A、B、C使用,如果函數(shù)庫(kù)為目的碼或原始程序碼,則程序編譯之后,函數(shù)庫(kù)X將會(huì)各自成為執(zhí)行檔A、B、C的一部份,而將來(lái)如果應(yīng)
5、用程序A、B、C同時(shí)執(zhí)行,函數(shù)庫(kù)X也會(huì)各自占用一份記憶體,顯然這是比較浪費(fèi)記憶體的方式。如果函數(shù)庫(kù)為DLL形式,則編譯之后,函數(shù)庫(kù)并不會(huì)成為執(zhí)行檔的一部分,而將來(lái)如果應(yīng)用程序A、B、C同時(shí)被執(zhí)行,則系統(tǒng)只會(huì)載入一份函數(shù)庫(kù)讓程序A、程序B、程序C共用,如圖。Figure:程序與DLL的共用架構(gòu)圖˙動(dòng)態(tài)鏈接庫(kù)節(jié)省記憶體空間動(dòng)態(tài)鏈接庫(kù)的資源共享可以節(jié)省磁碟空間,而動(dòng)態(tài)載入的連結(jié)方式則可以節(jié)省記憶體空間。動(dòng)態(tài)鏈接庫(kù)采用動(dòng)態(tài)載入的連結(jié)方式,動(dòng)態(tài)載入讓程序檔在需要相關(guān)的函數(shù)或資源的時(shí)候,才載入放置在動(dòng)態(tài)鏈接庫(kù)里
6、面的函數(shù)或資源,這種方式將可以有效地使用記憶體。不論是節(jié)省磁碟空間或記憶體空間,都是希望利用動(dòng)態(tài)鏈接庫(kù)所提供的共享函數(shù)與系統(tǒng)資源的方式,降低整個(gè)Windows環(huán)境對(duì)于硬體設(shè)備的需求。DLL的問(wèn)題-DLLHell˙動(dòng)態(tài)鏈接庫(kù)到底出了什么問(wèn)題?其實(shí)DLL的優(yōu)點(diǎn)(程序碼共用、節(jié)省記憶體),正是其缺點(diǎn)的起源。原本是立意良好的DLL,有一天會(huì)變成DLLHell,恐怕是當(dāng)初DLL的設(shè)計(jì)者所始料未及的。而之所以會(huì)出現(xiàn)DLLHell,也是因?yàn)閯?dòng)態(tài)鏈接庫(kù)可以與其他程序共用函數(shù)、共享資源所引起,可謂「成也共用、敗也共用
7、」。此話(huà)怎講呢?為了要讓其他程序共用動(dòng)態(tài)鏈接庫(kù)所提供的函數(shù)或資源,動(dòng)態(tài)鏈接庫(kù)的設(shè)計(jì)者必須相當(dāng)謹(jǐn)慎地、縝密地考慮到功能的一致性、回溯相容等細(xì)節(jié)問(wèn)題,否則一旦程序所使用動(dòng)態(tài)鏈接庫(kù)沒(méi)有提供所預(yù)期的功能,那么使用者就會(huì)為此而掉入地獄了。但是要完全考慮到一致性或回溯相容,實(shí)在是困難重重,就算真的要做到,也會(huì)讓利用動(dòng)態(tài)鏈接庫(kù)的軟體廠(chǎng)商付出相當(dāng)?shù)某杀?;但,有必要付出這些成本嗎?想想現(xiàn)今的電腦執(zhí)行環(huán)境,與當(dāng)初微軟設(shè)計(jì)動(dòng)態(tài)鏈接庫(kù)的時(shí)候已經(jīng)有相當(dāng)、相當(dāng)大的變化?,F(xiàn)在的硬體比起當(dāng)初已經(jīng)便宜太多、太多了,個(gè)人電腦的記憶體都
8、是從64MB起跳,配備128MB記憶體的電腦更是比比皆是,而硬碟容量更是以GB計(jì)算。在如此的硬體環(huán)境之下,Windows程序設(shè)計(jì)師還需要這么刻苦地考慮共用的問(wèn)題嗎?而且動(dòng)態(tài)鏈接庫(kù)的動(dòng)態(tài)載入,其實(shí)已經(jīng)替Windows系統(tǒng)節(jié)省了不少系統(tǒng)資源,因此微軟也重新調(diào)整動(dòng)態(tài)鏈接庫(kù)的設(shè)計(jì)理念,而且也針對(duì)作業(yè)系統(tǒng)進(jìn)行改善,希望不要再有任何使用者掉入因?yàn)楣灿脛?dòng)態(tài)鏈接庫(kù)而起的地獄深淵。˙數(shù)種DLLHell的狀況讓我們想一想,如果某一副程序或物件類(lèi)別有90%符合我們的需求,卻有10%不符合,