Re: [問題] 發佈程式到其他電腦上
※ 引述《legnaleurc (CA)》之銘言:
: 我的程式是用 VC 2008 編的
: 現在我要把執行檔打包送出
: 可是在 target 上一直無法執行
: 我有在 target 上用 DependencyWalker 看
: 沒有缺 dll
: 但是一直出現:
: Error: The Side-by-Side configuration information for "檔名" contains errors.
: 檔名裡是我自己用 VC 編出的 binary
: 我試過很多方法了
: 包括複製 manifest 到目錄裡
: 都沒用
: 裝 redist.exe 有機會解決這個問題
: 可是這個方法需要管理者權限, 不是每台電腦都有裝
: 我也有看過 MSDN 上關於 XCopy 的方法
: 一樣沒用 ....
: 我想問到底怎樣發佈才能正常執行
: PS:
: 也許有人會建議我改用 MinGW, 不過有些組件 MinGW 無法移植
: 因此不考慮換其他 toolchain
這問題還蠻有趣的,剛試了一下有成功,做了點紀錄。
小記:
1. 預設狀況下,VC的專案設定是會產生 manifest 檔。如果改成不產生此檔執行時
會有問題,現在變成無論如何都要有??
2. 預設值會將 manifest 內嵌進 exe,所以不需要外接。有內嵌時,外接會被無視。
3. 專案設定改成外接後,manifest 需要跟執行檔同名放一起,
如 1.exe 與 1.exe.manifest。找不到時會有 R6034 這類錯誤。
4. 承上,有錯誤時到事件檢視器去看看,有時會有比錯誤視窗更詳細的說明。
--
改成 portable 流程:
簡單的例子,用 C 的 Hello World,再 VC 編譯成 /MD,故需要 msvcr90.dll
(數值為假設,可能相異)。
專案設定->資訊清單工具->輸入和輸出->內嵌資訊清單=否,故 build 後會輸出
1.exe 與 1.exe.manifest。
打開 1.exe.manifest,刪掉 publicKeyToken 設定,因為 1.exe.manifest 裡面寫
name="Microsoft.VC90.CRT",所以這代表了預設會到
%WinDir%/WinSxS 裡去搜尋 Microsoft.VC90.CRT 對應檔案
在我電腦的是 x86_Microsoft.VC90.CRT_略_9.0.21022.8_x-ww_略.manifest
因為有安裝 VC,所以還有另外一個 Microsoft.VC90.CRT.manifest 在 redist
目錄裡。
將 Microsoft.VC90.CRT.manifest 複製到 1.exe 所在,
同樣刪掉 publicKeyToken 那行設定。
則只要 1.exe + 1.exe.manifest + msvcr90.dll + Microsoft.VC90.CRT.manifest
放在同一個目錄就能執行。
--
(註:可用 Resource Hacker 之類的軟體開 exe 來檢查其有無內嵌 manifest。可用
process monitor 軟體監視 exe 檔被執行後,搜尋 dll 的動作是到哪去。
可用 everything 快速找出電腦上 dll、manifest 相關檔案)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.130.199
→
07/04 03:21, , 1F
07/04 03:21, 1F
補充:
查詢 1.exe 的 manifest 得到某 dll 的 name 如 Microsoft.VC90.CRT 之後
搜尋 %windir%\winsxs\policies 查看是否有無針對此dll的政策設定
由policies規定版本去找 %windir%\winsxs\Manifests 裡有無該dll的 manifest
若能找到,則接著到winsxs裡找政策規定版本的dll。
winsxs沒有找到時,才到1.exe同目錄下找該dll的manifest及dll。
當想要限定 1.exe 使用特定版本的 dll,卻怕目標電腦 policies 規定的 dll
是更新版時,上文「改成 portable 流程」裡的方法可避開winsxs的policies
※ 編輯: zlw 來自: 124.8.130.199 (07/04 05:46)
推
07/04 17:20, , 2F
07/04 17:20, 2F
推
07/06 12:24, , 3F
07/06 12:24, 3F
→
07/06 12:24, , 4F
07/06 12:24, 4F
→
07/06 12:25, , 5F
07/06 12:25, 5F
→
07/06 12:46, , 6F
07/06 12:46, 6F
→
07/06 12:47, , 7F
07/06 12:47, 7F
→
07/06 12:49, , 8F
07/06 12:49, 8F
→
07/06 12:51, , 9F
07/06 12:51, 9F
→
07/06 12:52, , 10F
07/06 12:52, 10F
推
07/06 17:51, , 11F
07/06 17:51, 11F
討論串 (同標題文章)