




全文預(yù)覽已結(jié)束
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Assembly Manifest 通俗簡易手冊恩,為了大家都能很方便的理解,我將盡量簡單通俗地進(jìn)行描述。現(xiàn)象對這個問題的研究是起源于這么一個現(xiàn)象:當(dāng)你用VC+2005(或者其它.NET)寫程序后,在自己的計算機(jī)上能毫無問題地運(yùn)行,但是當(dāng)把此exe文件 拷貝到別人電腦上時,便不能運(yùn)行了,大致的錯誤提示如下:應(yīng)用程序配置不正確,請重新安裝程序或者是MSVCR80D.dll 沒有找到什么的(我記得不是很清楚,不過大致是這樣的)分析看到這樣的提示,當(dāng)然不會傻到重裝咯。第一反應(yīng)應(yīng)該是什么配置有問題、或者是缺少了什么依賴的庫文件;于是我就根據(jù)以前Windows缺少庫文件的經(jīng)驗(yàn), 把所有庫文件(.DLL)統(tǒng)統(tǒng)一股腦地復(fù)制到當(dāng)前文件夾下來,滿心歡喜以為可以運(yùn)行了,以運(yùn)行#¥#¥還是掛了。探索于是開始網(wǎng)上搜索,我Google,我擺渡;漸漸我發(fā)現(xiàn),這一切都和一個叫做*.manifest 類型的文件發(fā)生關(guān)系,那么到底什么是 .manifest 文件呢?他有什么用,以前為什么沒有?后來,經(jīng)過艱苦努力,終于得知,原來這一切都是Windows 的Assembly Manifest搞的鬼。這個東東的作用就是為了解決 以前windows上的“Dll 地獄” 問題才產(chǎn)生的新的DLL管理解決方案。大家知道,Dll是動態(tài)加載共享庫,同一個Dll可能被多個程序所使用,而所謂“Dll 地獄”就是當(dāng)不通程序依賴的Dll相同,但版本不同時,由于系統(tǒng)不能分辨到底哪個是哪個,所以加載錯了Dll版本,然后就掛了。于是蓋茨就吸取了教訓(xùn),搞 了一個程序集清單的東東,每個程序都要有一個清單,這個清單存再和自己應(yīng)用程序同名的.manifest文件中,里面列出其所需要的所有依賴,這兒所列出 的依賴可不是簡單地靠文件明來區(qū)分的,而是根據(jù)一種叫做“強(qiáng)文件名”的東西區(qū)分的,那么什么是強(qiáng)文件明呢?我們來看一下這個.manifest文件便知道 了。我們發(fā)現(xiàn)原來這是一個XML格式的文件,其中這一部分指明了其依賴于一個名字叫做Microsoft.VC80.CRT的庫。但是我們發(fā)現(xiàn),屬性里面還有其它的東東,分別是type系統(tǒng)類型,version版本號,processorArchitecture平臺環(huán)境,publicKeyToken公匙(一般用來標(biāo)示一個公 司)把他們加在一起便成了“強(qiáng)文件名”了,有了這種“強(qiáng)文件名”,我們就可以根據(jù)其區(qū)分不同的版本、不同的平臺總之,有了這種強(qiáng)文件名,系統(tǒng)中可 以有多個不同版本的相同的庫共存而不會發(fā)生沖突。深入恩,那么現(xiàn)在,我們就來具體了解一下這一套機(jī)制。首先是強(qiáng)弱文件名的問題。正如上面提到的那樣,為了區(qū)分不同版本或不同廠商生成的相同的程序集,必須用一個Assembly Manifest程序清單來列出我這個程序集的強(qiáng)文件名慢著,到這里你可能會問:剛才不是說Assembly Manifest程序清單是列出其所依賴的程序集的強(qiáng)文件名呢,怎么這里變成了當(dāng)前文件的強(qiáng)文件明了呢?其實(shí),Assembly Manifest程序清單有兩部分功能,上面這個實(shí)例之所以標(biāo)注了其所依賴的文件的強(qiáng)文件名是因?yàn)槠涫强蛻舳说腁ssembly Manifest,在服務(wù)端有另外一個Manifest 來標(biāo)注。phRUExlAeZ8BwmlD8VlO5udAnRE=7AY1JqoUvK3u/6bYWbOagGgAFbc=hWq8zazTsMeKVxWFBa6bnv4hEOw=這個便是從WINDOWSWinSxSManifests目錄下取出來的一個manifest文件,再這個文件夾下有一陀子這種XML格式的 manifest文件,其是服務(wù)端的程序清單。WinSxs是windows XP以上版本提供的blue非托管并行緩存(side-by-side catche)/blue里面安裝了各種版本的經(jīng)過強(qiáng)文件名簽名的系統(tǒng)庫,而上面這個文件正是標(biāo)注 了系統(tǒng)中Microsoft.VC80.CRT的一個版本的強(qiáng)文件名簽名,如果其和客戶端。.manifest 清單里面所列出的依賴項(xiàng)對上的話,就會被加載。剛才說的side-by-side 是指各種不同的版本并行運(yùn)行。上面這個服務(wù)端manifest文件中標(biāo)簽具體指明了當(dāng)前強(qiáng)文件名簽名的到底是哪一個文件,其中還有這個文件的Hash簽名,以確保文件的完整性。好了,有了這一套機(jī)制,就可以非常非常安全地進(jìn)行庫文件關(guān)聯(lián)了,但是、但是貌似還有一個一直困擾我們的問題:這套機(jī)制安全是安全了,但是卻失去了以前良好 的前后版本兼容性,即如果你的系統(tǒng)庫發(fā)生了升級,那么服務(wù)端的版本號發(fā)生了變化,那豈不是所有服務(wù)端程序都不能使用了嗎?其實(shí),windows還使用一個 policy的策略文件來確認(rèn)映射關(guān)系。這便是在WINDOWSWinSxSPolicies目錄下的一個Policy文件,其中標(biāo)簽便指定 了所有8.0.41204.256-8.0.50608.0變本的客戶需求映射到8.0.50727.42這個我現(xiàn)在系統(tǒng)中安裝的比較新的版本的庫。當(dāng)然 我們也能對別的字段進(jìn)行映射,這樣便能很好解決系統(tǒng)升級帶來的問題。應(yīng)用經(jīng)過以上的講解,大家對整個依賴查找過程都有了一個整體的認(rèn)識,那么在實(shí)際中問題就好解決了。讓我們回到實(shí)際問題中,我之前說了,把一個程序編譯連接成可執(zhí)行程序后,在別人的電腦上發(fā)現(xiàn)找不到其所依賴的庫了,那么怎么辦呢?聰明的你自然想到把其所 依賴的庫相應(yīng)的版本拷貝到目標(biāo)計算機(jī)上面,可是當(dāng)你在拼命尋找那個可執(zhí)行文件的assembly manifests文件的時候,卻突然發(fā)現(xiàn)找不到了,在執(zhí)行目錄下面明明只有一個exe文件嘛。是不是沒有生成呢?顯然不會,原來是資源連接器把那個 assembly manifests文件連接到了可執(zhí)行文件里面了;不信,你可以用你的vc+打開一個可執(zhí)行文件看看,在其資源項(xiàng)里面就有一個叫做 RT_MANIFEST的項(xiàng)目。這個里面就是二進(jìn)制標(biāo)示的manifests文件。那么根據(jù)這里面提供的要求,將相應(yīng)版本的依賴文件(一般就是CRT運(yùn)行 庫)拷貝到系統(tǒng)目錄WindowsWinSxS,記住一般會是連帶著一個特殊命名的目錄一起拷貝到那個文件夾下,比如CRT的運(yùn)行庫就是WinSxS x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50608.0_x-ww_b7acac55有這樣一個目錄,其標(biāo)注了此庫的版本號以及簽名等信息,以防止多個版本重名時不能復(fù)制到同一WinSxS目錄下。這樣就搞定了么?如果是以前,那么一切都解決了,系統(tǒng)會在這個目錄下面找到這個運(yùn)行庫,可是現(xiàn)在單單這樣可不行,系統(tǒng)可是要找到這個運(yùn)行庫的 assembly manifests文件,并且對比強(qiáng)文件名之后才能加載,所以所以千萬別忘了把相應(yīng)的manifests文件拷貝到WinSxSManifests目 錄下面。當(dāng)然,這樣在目標(biāo)的系統(tǒng)文件夾下面打動干戈,自然有些過于暴動了,還好,Windows還為我們提供了一種私有查找方式。這種方式會在前面的位置找不到合 適庫的時候在本地文件夾下面找。所以你只要把之前的庫以及那個manifests文件一起拷貝到你的應(yīng)用程序的路徑下面,就可以使用啦。根據(jù)MSDN的說明,在本地查找并加載遵循一下規(guī)則:在應(yīng)用程序本地文件夾中查找名為 .manifest 的清單文件。在此示例中,加載程序試圖在 appl.exe 所在的文件夾中查找 Microsoft.VC80.CRT.manifest。如果找到該清單,加載程序?qū)膽?yīng)用程序文件夾中加載 CRT DLL。如果未找到 CRT DLL,加載將失敗。嘗試在 appl.exe 本地文件夾中打開文件夾 ,如果存在此文件夾,則從中加載清單文件 .manifest。如果找到該清單,加載程序?qū)?文件夾中加載 CRT DLL。如果未找到 CRT DLL,加載將失敗。最后,我想補(bǔ)充的一點(diǎn)是,在你的VC+安裝目錄下面的“Microsoft Visual Studio 8VCredist”目錄下,有著所有的提供發(fā)布的已經(jīng)配備相應(yīng).manifest的庫文件。所以你想要發(fā)布一個程序最簡單最安全
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 創(chuàng)新教育方法數(shù)字化教育工具的實(shí)踐與思考
- 文化多樣性與社會認(rèn)同的關(guān)系研究試題及答案
- 2025年纖維石膏板行業(yè)分析報告及未來五至十年行業(yè)發(fā)展報告
- 工程法規(guī)2025年深度挖掘試題
- 2025年塑料回收再利用產(chǎn)業(yè)現(xiàn)狀與發(fā)展趨勢報告
- 2025年科技創(chuàng)新券資金申請:企業(yè)研發(fā)投入策略報告
- 商業(yè)教育中的設(shè)計思維與可持續(xù)發(fā)展策略
- 內(nèi)蒙古自治區(qū)電子元件及組件制造行業(yè)企業(yè)排名統(tǒng)計報告
- 2025年會計實(shí)務(wù)問題庫試題及答案
- 企業(yè)人才招募的數(shù)字化轉(zhuǎn)型趨勢與對策
- 2025委托維修服務(wù)合同模板
- 延安通和電業(yè)有限責(zé)任公司招聘筆試真題2024
- 上海市松江區(qū)2024-2025學(xué)年七年級下學(xué)期期中數(shù)學(xué)試卷
- 2024年新疆吉木乃縣事業(yè)單位公開招聘輔警23名筆試題帶答案
- 昆明理工大學(xué)津橋?qū)W院教職工招聘真題2024
- 陜西電網(wǎng)面試試題及答案
- 品質(zhì)組長考試試題及答案
- 2025年高考語文大題突破訓(xùn)練:微寫作(北京專用)解析版
- 設(shè)備合同三方付款協(xié)議
- 《家禽的繁殖》課件
- 2025屆浙江省六校聯(lián)盟高三第五次模擬考試英語試卷含答案
評論
0/150
提交評論