整合網路中的VC2005中manifest問題

2021-04-14 06:40:16 字數 2912 閱讀 2452

由於vs.net 2005 採用了一種新的dll方案,搞成乙個exe還要配有乙個manifest檔案(一般在嵌入檔案裡了,所以看不到,不過也可以不嵌入,這樣會生產乙個

《程式名》

.exe.manifest的檔案,沒它exe自己就轉不了了:)這是個新功能,微軟弄了個新工具(mt.exe),結果不好用,好像是fat32下時間戳有問題(在ntfs下這個問題就沒有了),搞得manifest有時嵌入不到exe中(預設配置是嵌入的,所以就報錯找不到 dll了。

解決方案

1.微軟對於這個問題應該也有處理,不過感覺不是很人性化。在「屬性->配置屬性->清單工具->常規「下有乙個」使用fat32解決辦法,把它選成是,就可以了。(注意:一定要先配置這個選項,然後再編譯工程,要不然還是不好用:)

2. 找到你的工程的資料夾,如(myproject),找到其下的myproject/myproject/debug/ myproject.rec,把它刪掉(刪掉整個debug目錄也可以),重新編譯,搞定!

選擇你所使用的檔案系統:

vc.txt

fat32(f)

ntfs(n)

好,儲存關閉,這個改完了,準備下乙個。

3) 開啟scripts/2052,這裡就乙個檔案,ue開啟它,找到138行「 var batl = wizard.findsymbol(」support_atl」);」其後回車,插入如下內容:

var mftool = config.tools("vcmanifesttool"); mftool.usefat32workaround = true;

好,繼續找到210行(原始檔的210,你加了上邊的語句就不是210了:)「 config = proj.object.configurations.item(」release」);」注意這次要在這行「前邊」加如下內容:

if(bfat32)

好了,終於都改完了,開啟你的vs.net 2005新建乙個win32應用程式看看吧,效果還不錯吧

manifest原理和用途

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

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

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

對於應用程式而言,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>

除非,你的程式是靜態鏈結的,沒有使用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】

參考**:

整合網路中的VC2005中manifest問題

由於vs.net 2005 採用了一種新的dll方案,搞成乙個exe還要配有乙個manifest檔案 一般在嵌入檔案裡了,所以看不到,不過也可以不嵌入,這樣會生產乙個 程式名 exe.manifest的檔案,沒它exe自己就轉不了了 這是個新功能,微軟弄了個新工具 mt.exe 結果不好用,好像是f...

在VC 2005中內嵌彙編

在vc 2005中內嵌彙編 一na和nb進行數值交換 intna 10 intnb 11 asm 二 加法運算 intassembleradd int na,int nb return nb 三 減法運算 intassemblersub int na,int nb return na 四 採用彙編呼...

VC2005中測試Taucs庫通過

所使用的 taucs 為openmesh 中的版本。將之拷貝到乙個目錄,如 d devtools taucs win32.然後修改建立的 project 的屬性,在 code generation 選擇multithread release 或multithread debug,然後加上附加的路徑 ...