VC manifest
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
總結
以上是生活随笔為你收集整理的VC manifest的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 入门-1
- 下一篇: c语言中volatile关键字的作用