NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

manifest原理和用途

dll是被動態呼叫的,所以會被若干個程式共享使用的 但是如果dll在應用程式不知道的情況下升級了、或是被另一個程式更改了,就可能會出現問題,即”DLL Hell”

 

隨著系統資源越來越豐富,硬碟不那麼緊張,所以在XP以後的作業系統中,用新的機制來管理DLL

 

(這種機制,這不僅僅是對於.NET而言,對於普通的Native程式也是一樣的)

 

Madifest是個XML的描述檔案,對於每個DLL有DLL的Manifest檔案,對於每個應用程式Application也有自己的Manifest

 

對於應用程式而言,Manifest可以是一個和exe檔案同一目錄下的.manifest檔案,也可以是作為一個資源嵌入在exe檔案內部的(Embed Manifest)

 

XP以前版本的windows,會像以前那樣執行這個exe檔案,尋找相應的dll,沒有分別Manifest只是個多餘的檔案或資源,dll檔案會直接到system32的目錄下查詢,並且呼叫

 

而XP以後的作業系統,則會首先讀取Manifest,獲得exe檔案需要呼叫的DLL列表(此時獲得的,並不直接是DLL檔案的本身的位置,而是DLL 的manifest)作業系統再根據DLL的Manifest去尋找對應的DLL<因此就可能區別不同版本的同一個DLL檔案,或是指定一個程式本 身Isolated的DLL>

 

不過使用Visual Studio 2005以後的一個新問題是,VS2005帶的8.0新版的C執行庫(VC 8.0 CRT)檔案在XP以後支援manifest的Windows版本中被呼叫時,將會check一下Application自身的Manifest,否則將 會拒絕被呼叫。這也就是說,使用Visual Studio開發的Application,Manifest將是必不可少的(搞不懂MS為啥要這樣設定,所以與VS2003.NET不同了。後來想想, 除了MS自己說的哪些冠冕堂皇的原因,至少這樣一來Linux的Wine模擬要麻煩多了)

 

除非,你的程式是靜態連結的,沒有使用dll,只使用了作業系統核心的 Kernel32.dll, User32.dll, Ole32.dll, 或ShDocVW.dll 等。project的設定必須是Use Standard Windows Libraries、Not Using ATL、No Common Language Runtime support

 

那麼你可以不需要考慮Manifest 可以關掉它

 

VS2005中Menifest相關的設定

 

  • Project/Properties/Linker/Manifest File/Generate Manifest 決定是否生成Manifest,如上情況才可以關閉
  • Project/Properties/Linker/Manifest File/Allow Isolation 這個是設定DLL的呼叫的,並不能決定Manifest是否還是必須的
  • Project/Properties/Manifest Tool/Input and Output/Embed Manifest 決定Manifest是個單獨的檔案還是嵌入到exe內的資源

對於我來說,使用SDL必須是啟用DLL的動態連結方式,所以必須開啟Manifest,並且讓Manifest Embed進入exe比較方便

 

與上面內容相應的 是關於如何釋出軟體的問題,事實上只有VC6.0的CRT庫是繫結作為Windows的一部分的,之後從VS.net開始,VC程式製作安裝包也是要考慮 庫檔案的,只不過VC6.0時推薦拷入System32,VC.net時推薦放在exe檔案local目錄,而現在VS2005則還需要考慮 Manifest的問題了,看似麻煩,其實也還好,VS自帶工具打包,下面一些網址也有講如何手工做redistribution

相關文章

程式語言 最新文章