2009-12-16 27 views
7

MyApp版本1.0包含文件foo.dll。該文件的版本是版本10.5.567。現在MyApp是2.0版,而foo.dll的版本是2.0.123。版本比舊版本低。寫這個DLL的供應商決定用文件版本號倒退。這不是我可以改變的決定。與WiX無關的版本號安裝文件

如何讓WiX始終安裝此文件?

RemoveExistingProducts操作安排在InstallFinalize操作之後,也無法更改。

InstallShield有一個'始終覆蓋'標誌,但我不認爲如果不通過編譯器開關更改所有文件的行爲,我就不會模仿它。我不想要這個。我只想更新這一個文件。

我也曾嘗試

<RemoveFile Id="foo.dll" On="install" Name="foo.dll" /> 

但是,這也不能工作。我最終得到'錯誤2753 foo.dll文件未被標記爲安裝'。

回答

3

這並不容易,因爲它違背了MSI軟件包的標準行爲。編譯時,必須在light.exe中用-sf設置supress-file-options。然後,沒有讀取文件的文件信息。你可以設置DefaultVersion這個版本將被使用。 我也在解決方案中使用RemoveFile,但我可以說它的工作原理。我將它添加到我添加文件的相同組件中。

<Component> 
     <File DiskId="1" Id="fooDLL" Name="foo.dll" Vital="yes" 
     DefaultVersion="$(var.MAJORVERSION).$(var.MINORVERSION).$(var.BUILDVERSION)" 
     DefaultLanguage="0"></File> 
     <RemoveFile Id='RemoveOldDLL' On='install' Name='foo.dll'/> 
    </Componente> 

這不是一個乾淨的方法,但刪除舊版本它適用於我。

+0

沒有試過這個,但看起來可能。請參閱我在此主題中的回覆,以獲取指向不同方法列表的鏈接。 – 2011-05-25 15:12:21

+0

我嘗試使用DefaultVersion來安裝.MDE文件,並且它在我安裝該修補程序時正常工作,該文件被正確覆蓋。唯一的問題是該補丁不會卸載。安裝日誌表示「新文件版本化 - 現有文件未版本化」,以及爲原始媒體調用的卸載。我仍然沒有解決這個問題,所以任何建議都會受到歡迎。 – Dave 2015-12-11 11:39:17

-1

有一件值得嘗試的事情是在序列中儘早設置RemoveExistingProducts。 MSI應該先刪除舊程序,然後安裝升級程序。這將解決您的問題。例如

<InstallExecuteSequence> 
    <RemoveExistingProducts After="CostFinalize" /> 
</InstallExecuteSequence> 
+0

不幸的是,它必須在* CostFinalize之前發生(因爲CostFinalize是MSI評估要更新哪些文件的步驟) - 並且據我所知,RemoveExistingProducts不允許在早期進行排序。如果你找到解決辦法,我很樂意聽到它。 :) – jalf 2014-05-23 11:05:39

1

註釋

隊總是在Light.exe輸出覆蓋的 「絕招的InstallShield」:

的XPath =「/ wixOutput /表[@名稱= '文件'] /行/場[5]「InnerText =」65535.0.0.0「