別再掉進(jìn)dll地獄的陷阱里(dllhell).解決之道

別再掉進(jìn)dll地獄的陷阱里(dllhell).解決之道

ID:8826145

大?。?62.00 KB

頁數(shù):10頁

時(shí)間:2018-04-08

別再掉進(jìn)dll地獄的陷阱里(dllhell).解決之道_第1頁
別再掉進(jìn)dll地獄的陷阱里(dllhell).解決之道_第2頁
別再掉進(jìn)dll地獄的陷阱里(dllhell).解決之道_第3頁
別再掉進(jìn)dll地獄的陷阱里(dllhell).解決之道_第4頁
別再掉進(jìn)dll地獄的陷阱里(dllhell).解決之道_第5頁
資源描述:

《別再掉進(jìn)dll地獄的陷阱里(dllhell).解決之道》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。

1、DLL陷阱是一個(gè)惡夢,是一種相當(dāng)奇怪的問題。相信很多讀者都有這樣的經(jīng)驗(yàn),如果你的軟體今天原本運(yùn)作順暢,當(dāng)你安裝某個(gè)新軟體之后,突然間電腦就無法運(yùn)作了。這絕對不是你的硬體有問題,也不是應(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)-動態(tài)鏈接庫?微軟當(dāng)初為Windows設(shè)計(jì)動態(tài)鏈接庫主要是擷取它的兩項(xiàng)優(yōu)點(diǎn):一是動態(tài)連結(jié)、一是資源共享。資源共享的例子相當(dāng)顯而易見,例如之前曾經(jīng)提過Windows有三個(gè)核心的動態(tài)鏈接庫:Kernel主要是負(fù)責(zé)系統(tǒng)和應(yīng)用程序的記憶體、行程和執(zhí)行緒等等的管理工作;User主要負(fù)責(zé)使用者介面和訊息的傳遞;GDI則負(fù)責(zé)系

3、統(tǒng)的任何圖形繪制、顯示等工作。而這些動態(tài)鏈接庫所提供的任何函數(shù)都可以在必要的時(shí)候,讓每一個(gè)Windows環(huán)境底下的執(zhí)行檔使用。因?yàn)镈LL具備節(jié)省記憶體的特性,因此自從Windows3.1版以來,它就逐漸成為Windows程序設(shè)計(jì)的主流˙動態(tài)鏈接庫可以資源共享許多大型軟體廠商的眾多軟體產(chǎn)品可能都會有許多可以共用的模組,如果每一套軟體各自擁有一份這些可以共用的模組,不僅會造成磁碟空間的浪費(fèi),還會讓維護(hù)這些模組的工作變的既復(fù)雜、又凌亂。最好的方法就是僅保持一份程序碼,然后透過共享的方式讓其他自家的應(yīng)用程序也可以存取其中共用的模組。共用模組的方法之一就是將模組制作成動態(tài)鏈接庫,然后透過軟體

4、的安裝程序復(fù)制到電腦,那么只要安裝了其中一套軟體之后,其他自家的產(chǎn)品就可以互相共用這一套動態(tài)鏈接庫。假設(shè)有一函數(shù)庫X供三個(gè)應(yīng)用程序A、B、C使用,如果函數(shù)庫為目的碼或原始程序碼,則程序編譯之后,函數(shù)庫X將會各自成為執(zhí)行檔A、B、C的一部份,而將來如果應(yīng)用程序A、B、C同時(shí)執(zhí)行,函數(shù)庫X也會各自占用一份記憶體,顯然這是比較浪費(fèi)記憶體的方式。如果函數(shù)庫為DLL形式,則編譯之后,函數(shù)庫并不會成為執(zhí)行檔的一部分,而將來如果應(yīng)用程序A、B、C同時(shí)被執(zhí)行,則系統(tǒng)只會載入一份函數(shù)庫讓程序A、程序B、程序C共用,如圖。Figure:程序與DLL的共用架構(gòu)圖˙動態(tài)鏈接庫節(jié)省記憶體空間動態(tài)鏈接庫的資源

5、共享可以節(jié)省磁碟空間,而動態(tài)載入的連結(jié)方式則可以節(jié)省記憶體空間。動態(tài)鏈接庫采用動態(tài)載入的連結(jié)方式,動態(tài)載入讓程序檔在需要相關(guān)的函數(shù)或資源的時(shí)候,才載入放置在動態(tài)鏈接庫里面的函數(shù)或資源,這種方式將可以有效地使用記憶體。不論是節(jié)省磁碟空間或記憶體空間,都是希望利用動態(tài)鏈接庫所提供的共享函數(shù)與系統(tǒng)資源的方式,降低整個(gè)Windows環(huán)境對于硬體設(shè)備的需求。DLL的問題-DLLHell˙動態(tài)鏈接庫到底出了什么問題?其實(shí)DLL的優(yōu)點(diǎn)(程序碼共用、節(jié)省記憶體),正是其缺點(diǎn)的起源。原本是立意良好的DLL,有一天會變成DLLHell,恐怕是當(dāng)初DLL的設(shè)計(jì)者所始料未及的。而之所以會出現(xiàn)DLLHell

6、,也是因?yàn)閯討B(tài)鏈接庫可以與其他程序共用函數(shù)、共享資源所引起,可謂「成也共用、敗也共用」。此話怎講呢?為了要讓其他程序共用動態(tài)鏈接庫所提供的函數(shù)或資源,動態(tài)鏈接庫的設(shè)計(jì)者必須相當(dāng)謹(jǐn)慎地、縝密地考慮到功能的一致性、回溯相容等細(xì)節(jié)問題,否則一旦程序所使用動態(tài)鏈接庫沒有提供所預(yù)期的功能,那么使用者就會為此而掉入地獄了。但是要完全考慮到一致性或回溯相容,實(shí)在是困難重重,就算真的要做到,也會讓利用動態(tài)鏈接庫的軟體廠商付出相當(dāng)?shù)某杀?;但,有必要付出這些成本嗎?想想現(xiàn)今的電腦執(zhí)行環(huán)境,與當(dāng)初微軟設(shè)計(jì)動態(tài)鏈接庫的時(shí)候已經(jīng)有相當(dāng)、相當(dāng)大的變化?,F(xiàn)在的硬體比起當(dāng)初已經(jīng)便宜太多、太多了,個(gè)人電腦的記憶體都

7、是從64MB起跳,配備128MB記憶體的電腦更是比比皆是,而硬碟容量更是以GB計(jì)算。在如此的硬體環(huán)境之下,Windows程序設(shè)計(jì)師還需要這么刻苦地考慮共用的問題嗎?而且動態(tài)鏈接庫的動態(tài)載入,其實(shí)已經(jīng)替Windows系統(tǒng)節(jié)省了不少系統(tǒng)資源,因此微軟也重新調(diào)整動態(tài)鏈接庫的設(shè)計(jì)理念,而且也針對作業(yè)系統(tǒng)進(jìn)行改善,希望不要再有任何使用者掉入因?yàn)楣灿脛討B(tài)鏈接庫而起的地獄深淵。˙數(shù)種DLLHell的狀況讓我們想一想,如果某一副程序或物件類別有90%符合我們的需求,卻有10%不符合,

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時(shí)可能會顯示錯(cuò)亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。