2016-08-18 122 views
1

我有一個安裝了一些MSI的WiX託管引導程序應用程序。我還有一系列的測試可以執行安裝程序的各種功能。我遇到的問題是維修測試。該測試故意破壞我們安裝的所有DLL,然後用「/ repair/passive」標誌調用EXE安裝程序。一旦完成大約80%的DLL被修復,但其餘的未修改,因此修復後仍然損壞。從託管引導程序WiX修復無法修復一些損壞的DLL

如果我通過命令行args「/ fa」在單個MSI上手動運行msiexec,它指示MSI強制替換它安裝的所有文件,它會修復100%的DLL。

我的問題是我該如何強迫MBA來指導每個MSI以這種方式進行修復?我已經嘗試設置REINSTALLMODE屬性爲「amus」對個人的MSI在他們.wxs文件,但MBA覆蓋它們在運行時間通過這條線在日誌中可見一斑:

PROPERTY CHANGE: Modifying REINSTALLMODE property. Its current value is 'amus'. Its new value: 'cmuse'.

我我也嘗試在MBA中設置屬性以傳遞給每個MSI,但它似乎沒有通過它們,而是使用它的默認值。

我在這裏看到很多類似的問題,但沒有一個真正解決這個特定的問題。任何幫助將不勝感激。搶救我!

+0

msi安裝程序日誌必須說明與不相關的DLL相關的組件不會被取代? –

+0

執行op:ComponentRegister(ComponentId = {0B2B6D28-A32F-4BE8-B990-8DB2A4A790AA},KeyPath = C:\ **** \ estimator.dll,State = 3,Disk = 1,SharedDllRefCount = 0,BinaryType = 1 ) –

+0

Exec op:FileCopy(SourceName = ksncnr0g.dll | estimator.dll,SourceCabKey = fil46DA9182A232003B1FD10E3DF65EF686,DestName = estimator.dll,Attributes = 512,FileSize = 2220032,PerTick = 65536,VerifyMedia = 1 ,,,,, CheckCRC = 0 ,,, InstallMode = 59244544,HashOptions = 0,HashPart1 = -1917773179,HashPart2 = -1616579533,HashPart3 = -79796171,HashPart4 = -1442608125 ,,,) MSI(s0)(A0:34)[12:25:25 :874]:文件:C:\ **** \ estimator.dll; \t不會被覆蓋; \t不會打補丁; \t現有文件未版本化但已修改 –

回答

1

這是你的問題就在這裏:

[12:25:25:874]: File: C:****\estimator.dll; Won't Overwrite; Won't patch; Existing file is unversioned but modified 

安裝程序不會要覆蓋已更改,因爲它,如果它不能驗證版本或語言安裝文件(也許其他一些性質?) 。沒有這些屬性,它決定查看修改日期。如果它比第一次安裝時更新,那麼它將不會觸及它,而是假設某些原因發生了變化,並且恢復它會導致某些失敗。 (你可以閱讀更多here

一兩件事你可以在這種情況下,做的是使用一個Companion File

設置該屬性,使該文件的另一個文件的同伴孩子。伴隨文件的安裝狀態不取決於其自己的文件版本信息,而取決於其伴隨父項的版本控制。作爲其組件關鍵路徑的文件不能成爲配套文件(這意味着如果此文件的KeyPath =「yes」,則不能設置此屬性)。 Version屬性不能與此屬性一起設置,因爲伴隨文件不是基於它們自己的版本安裝的。

基本上,您將設置安裝/卸載此組件的邏輯與安裝中其他組件的「FileID」相同。在estimator.dll組件的File標籤中,刪除KeyPath="yes",而用CompanionFile="<NameOfAnotherFileID>"替換。

這種方法的問題是,你可能有一個損壞的DLL,但它鏈接到的companionFile很好,所以它不會被重新安裝。

如果這是你自己的DLL,我會強烈建議版本化文件!給它任何你想要的版本,這個問題應該消失。

另一件事你可以試試,但我不知道它是如何工作真的是給了文件DefaultVersion

這是該文件的默認版本。如果不使用壓制文件選項,鏈接器將從文件中的值中替換此值。

這將是最快的解決方案來驗證。只需在estimator.dll的<File>中建立一個新的安裝程序DefaultVersion="1.0",看看它是否被替換。我認爲這會讓安裝者認爲該文件是版本1.0,但是安裝的文件沒有版本,所以它會替換它(請參閱here

+0

非常感謝,這真是太棒了!不幸的是,我不擁有所有這些DLL。長遠目標是確保所有這些版本都是版本化的。這可能需要幾個月的時間。同時,你知道是否可以修改REINSTALLMODE默認值'cmuse'而不覆蓋它?這將是一個很好的臨時解決方案。 –

+0

您可以更改它,但它需要修改引擎的代碼並構建wix源以生成自定義burn.exe,如果您升級wix目標版本,這可能成爲可維護性的噩夢。我認爲另一個可行的解決方案是在修復期間(Install和REINSTALLMODE〜=「cmuse」)刪除未版本化的DLL,然後在InstallInitialize中強制替換它們。儘管如此,仍然是一種黑客。 (可能必須在InstallValidate之前將其移動?我不知道哪個操作實際上決定安裝組件) –

+0

您是否嘗試使用'DefaultVersion'標籤查看是否有效? –