讓程式不使用 side by side execution

1.
編譯時不要將 manifest embed 進程式,改產生 .manifest 檔。

2.
修改 .manifest 檔,將 publicKeyToken 這個項目及其內容拿掉。如果 .manifest 中有參考到兩個 CRT,將比較舊版本的 dependency 砍掉。(但不知道為何會產生兩個?!)

3.
至 C:\Windows\WinSxS 中,將對應的 CRT 版本目錄下,全部的 dll 檔 copy 至程式執行目錄。我的例子是將 x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700 這個目錄底下的 dll 全複製。

4.
至 C:\Windows\WinSxS\Manifests 目錄下,找出對應 CRT 版本的 .manifest 檔,複製至程式執行目錄。我的例子是 x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifest。

5.
將剛剛 copy 的 .manifest 更名為 Microsoft.VC80.CRT.manifest。

6.
修改 Microsoft.VC80.CRT.manifest,將 publicKeyToken 這個項目砍掉。

7.
執行程式,這樣應該就算在很乾淨的 OS 底下,都能夠跑了!

To-do:
這樣子的情況遇到個困難,下面是我的程式及函式庫關係:

Program --> LibA --> PublicLib -> MFC80.dll

LibA 是我寫的,參考到 PublicLib。PublicLib 動態連結了 MFC80.dll。當我利用上面方式來執行 program 時,是會跑出錯誤的!

如果看我程式產生出來的 .manifest,會發現裡頭沒有 MFC 的 dependency。Try 很多方式,包括手動在 .manifest 加入 MFC 的 dependency,都不成功!

如果有人知道怎麼解這種情形的,請不吝告知,感恩吶~

留言

熱門文章