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