Madifest檔案詳解

2021-07-26 18:56:09 字數 4446 閱讀 1772

xp以前版本的windows,會像以前那樣執行這個exe檔案,尋找相應的dll,沒有分別manifest只是個多餘的檔案或資源,dll檔案會直接到system32的目錄下查詢,並且呼叫。這樣,如果公共dll公升級,將會導致之前安裝的應用程式不能使用,這就是「dll hell」的**。為了解決這個問題,.net開發提出了side-by-by的開發方法,來避免這個問題。主要方法,就是通過manifest檔案來查詢相應的dll。xp及以後的系統都整合了這樣一種查詢dll的方法。

預設manifest檔案都是內嵌在exe/dll中的,如果需要檢視。vs提供mt.exe工具來從exe/dll中提取manifest檔案。

mt.exe -inputresource:d:\test.exe -out:d:\test.manifest
我們編譯mfc工程時,會在stdafx.h檔案裡看到下列**。

如果是非unicode版本,則生成的介面是win98風格,如果是unicdoe版本,則是當前作業系統的風格。

< ?xml version='1.0' encoding='utf-8' standalone='yes'?>

< assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestversion='1.0'>

< dependency>

< dependentassembly>

< assemblyidentity type='win32' name='microsoft.vc80.crt' version='8.0.50608.0' processorarchitecture='x86' publickeytoken='1fc8b3b9a1e18e3b' />

< /dependentassembly>

< /dependency>

< dependency>

< dependentassembly>

< assemblyidentity type='win32' name='microsoft.vc80.mfc' version='8.0.50608.0' processorarchitecture='x86' publickeytoken='1fc8b3b9a1e18e3b' />

< /dependentassembly>

< /dependency>

< dependency>

< dependentassembly>

< assemblyidentity type='win32' name='microsoft.windows.common-controls' version='6.0.0.0' processorarchitecture='x86' publickeytoken='6595b64144ccf1df' language='*' />

< /dependentassembly>

< /dependency>

< /assembly>

如果沒有設定上面的控制項風格,則生成的manifest不會包括contrls.

< ?xml version='1.0' encoding='utf-8' standalone='yes'?>

< assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestversion='1.0'>

< dependency>

< dependentassembly>

< assemblyidentity type='win32' name='microsoft.vc80.crt' version='8.0.50608.0' processorarchitecture='x86' publickeytoken='1fc8b3b9a1e18e3b' />

< /dependentassembly>

< /dependency>

< dependency>

< dependentassembly>

< assemblyidentity type='win32' name='microsoft.vc80.mfc' version='8.0.50608.0' processorarchitecture='x86' publickeytoken='1fc8b3b9a1e18e3b' />

< /dependentassembly>

< /dependency>

< /assembly>

所有的exe/dllft都必須要有manifest。如果linker→manifest file→generate manifest→no,則在必須manifest tool→additinal manifest files中指定相應的manifest檔案。 manifest tool→embed manifest→yes。一般都是將manifest檔案巢狀在程式中。也可以不巢狀在程式中,像mfcxx.dll, msvcrxx.dll,msvcpxx.dll都是沒有將manifest巢狀在程式中的。所以當使用它們時必須與其manifest檔案一起使用。

以下針對鏈結mfcxx.dll, msvcpxx.dll, msvcrxx.dll的程式。

系統啟動exe時,會先檢查其manifest檔案(如果沒有查詢到當前exe中有manifest,則會報「程式配置不正確的」的錯誤提示),查詢系統中是否有註冊相應的dll元件。如果有,則會去c:\windows\winsxs\manifest資料夾根據相應的呼叫策略及manifest檔案,然後再根據manifest中的內容去c:\windows\winsxs同名資料夾中查詢到關的dll。

如果沒有查詢到相應的dll,則會到當前目錄來查詢microsoft.vc80.crt.manifest和microsoft.vc80.mfc.manifest。

如果沒有查詢到當前exe中有manifest,則會報「程式配置不正確的」的錯誤提示。查到之後,就會去找相應的dll。然後執行程式。

選擇use mfc in share dll會用到mfcxx.dll. mfc80.dll, 即對應vs2005的。 mfc80u.dll,即對應vs2005的unicode版本。

選擇md/mdd則會用到下面的dll。 msvcr80.dll,即vs2005下的c runtime庫,提供基本的c函式。 msvcp80.dll, 即vs2023年的c++函式庫,如果有呼叫之類的檔案,則會使用到此dll。

1、x86、x64需要去vs工具目錄

c:\program files (x86)\microsoft visual studio 10.0\vc\redist\x86

c:\program files (x86)\microsoft visual studio 10.0\vc\redist\x64

2、manifest檔案自vs2010之後,又被整合到模組當中去了,不再分開提供。

Madifest檔案詳解

xp以前版本的windows,會像以前那樣執行這個exe檔案,尋找相應的dll,沒有分別manifest只是個多餘的檔案或資源,dll檔案會直接到system32的目錄下查詢,並且呼叫。這樣,如果公共dll公升級,將會導致之前安裝的應用程式不能使用,這就是 dll hell 的 為了解決這個問題,n...

Madifest檔案詳解

xp以前版本的windows,會像以前那樣執行這個exe檔案,尋找相應的dll,沒有分別manifest只是個多餘的檔案或資源,dll檔案會直接到system32的目錄下查詢,並且呼叫。這樣,如果公共dll公升級,將會導致之前安裝的應用程式不能使用,這就是 dll hell 的 為了解決這個問題,n...

mysql檔案詳解 MySQL日誌檔案詳解

概述 日誌檔案是mysql資料庫的重要組成部分。mysql有幾種不同的日誌檔案,通常包括錯誤日誌檔案,二進位制日誌,通用日誌,慢查詢日誌,等等。這些日誌可以幫助我們定位mysqld內部發生的事件,資料庫效能故障,記錄資料的變更歷史,使用者恢復資料庫等等。本文主要描述mysql的各種日誌檔案。1.錯誤...