2012-12-03 43 views
6

我有一個InstallShield 2012基本MSI項目,我一直在爲我們公司維護。我不是一名訓練有素的InstallShield開發人員(僅僅是當時圖騰柱上最低的時間),但是我已經在幾個月內拿起了足夠多的東西來讓所有的東西在不同版本之間平穩運行。安裝程序不覆蓋爲客戶端分支的舊DLL

最近我們的一位客戶堅持我們修復了我們已在最新版本中修復的舊版產品中的錯誤。我們通常不會創建修補程序,因爲完整的安裝程序兼作更新程序,但在這種情況下,我們已遵守規定,以所在版本創建了分支,並向它們發送了更新補丁。該修補程序中只包含一個文件,並且它與要替換的文件具有相同的版本。一切都好。

今天客戶希望升級到我們的最新版本。實際上,我們正在將他們的分支合併到主線中,並且由於他們的分支沒有額外的組件或特定於客戶端的代碼,我認爲我們可以簡單地將它們分配給我們的常規安裝程序並覆蓋所有內容。不是這樣的......

當我複製他們的分支安裝,並試圖更新文件安裝程序成功運行,並取代所有的東西,但他們分支的DLL。修改'omus','amus',強制覆蓋等等不會改變。事先刪除文件什麼都不做。不管我怎麼努力支DLL保持和日誌看起來是這樣的(名稱變更爲保護原封不動有罪,版本和GUID):

DLL,它可以正確地更新:

Executing op: RegisterSharedComponentProvider(,,File=dll_that_works.r1,Component={B4F132E0-6C2A-4138-990B-16B991F8C54D},ComponentVersion=1.1.1.195,ProductCode={B2F1D6AC-95A4-44A9-9A52-631A3AD14389},ProductVersion=1.1.1,PatchSize=0,PatchAttributes=0,PatchSequence=0,SharedComponent=0,IsFullFile=0) 
Executing op: FileCopy(SourceName=SY2F9C~1.DLL|dll_that_works.dll,SourceCabKey=dll_that_works.r1,DestName=dll_that_works.dll,Attributes=16384,FileSize=51584,PerTick=65536,,VerifyMedia=1,,,,,CheckCRC=0,Version=1.1.1.195,Language=0,InstallMode=130023424,,,,,,,) 
File: C:\inetpub\wwwroot\Service\bin\dll_that_works.dll; Overwrite; Won't patch; REINSTALLMODE specifies all files to be overwritten 
Source for file 'dll_that_works.r1' is compressed 

支的DLL不更新:

Executing op: SetSourceFolder(Folder=C:\Windows\Installer\$PatchCache$\Managed\CA6D1F2B4A599A44A92536A1A31D3498\1.1.1) 
Executing op: RegisterSharedComponentProvider(PatchGUID={EC6657A6-01A1-4AFC-86F9-1F4BF5F15481},MediaCabinet=#PCW_CAB_Family1,File=branched_dll.r,Component={74531F91-82A9-421D-A227-15DDDEDFC2FA},ComponentVersion=1.1.1.195,ProductCode={B2F1D6AC-95A4-44A9-9A52-631A3AD14389},ProductVersion=1.1.1,PatchSize=35952,PatchAttributes=0,PatchSequence=10000,SharedComponent=0,IsFullFile=0) 
Executing op: FileCopy(SourceName=branched_dll.r,SourceCabKey=branched_dll.r,DestName=branched_dll.dll,Attributes=0,FileSize=225664,PerTick=65536,,VerifyMedia=0,,TotalPatches=1,,,CheckCRC=0,Version=1.1.1.195,Language=0,InstallMode=130023424,,,,,,,) 
File: C:\inetpub\wwwroot\Service\bin\branched_dll.dll; Overwrite; Smart patch; REINSTALLMODE specifies all files to be overwritten 
Redirecting file copy of 'C:\inetpub\wwwroot\Service\bin\branched_dll.dll' to 'C:\Config.Msi\PTB2C9.tmp'. A subsequent patch will update the intermediate file, and then copy over the original. 
Source for file 'branched_dll.r' is uncompressed, at 'C:\Windows\Installer\$PatchCache$\Managed\CA6D1F2B4A599A44A92536A1A31D3498\1.1.1\'. 

這是有點超出我的深度。就在我可以告訴它正在嘗試修補分支的DLL時,不能這樣做,並且由於某種原因將文件引入臨時目錄(我無法找到有關「智能修補程序」究竟意味着什麼的詳細信息)。我已經看到使用錯誤版本的補丁會發生這種情況,但這不是一個補丁!這是一個正常的安裝程序,運行REINSTALLMODE = v(oa)mus和REINSTALL = ALL。它應該只是看到舊版本,看到它有一個更新的版本嵌入,並吹走舊版本。

(一時心血來潮我試圖更新DLL手動而不是使用更新我們給客戶端,一切正常更新,所以它不是嗆文件本身)

我的近期目標是讓這個客戶回同步,最好不用任何卸載和一個統一的安裝程序,而不是爲他們創建一個特殊的更新程序。由於這些文件已經在野外,如果這是不可行的,我可以忍受一個特殊情況。我未來的目標就是讓自己像自己所想的那樣自然地工作 - 文件是舊版本,文件被替換,沒有其他問題。

我想我已經提供了一切有關的,但如果沒有,我可以提供更多的信息。我花了更多的時間看這個,我根本找不到類似於這種情況的任何材料。

回答

2

從您對場景的描述中,它聽起來像爲您的客戶打補丁的組件的密鑰文件的「修改日期」可能晚於升級包中的日期,但版本相同。 Windows Installer可能不會替換該文件。請參見Replacing Existing Files以及FileF的行示例

此客戶可能需要使用自定義程序包,以便在應用最新的升級之前卸載修補的組件。

+0

這不起作用,但它是一個好主意。分支文件的修改日期WAS比我試圖替換它的組件更新。根據替換邏輯,這應該不重要,因爲這兩個文件都是版本控制的,但無論如何都值得測試。在安裝升級之前卸載補丁是一個想法;考慮到事件的順序可能會很棘手,但我會將其視爲可能的長期解決方案。 – CC1

+0

初看起來,我可以通過在註冊表中搜索我的產品代碼來回滾修補程序,確定引用分支修補程序的安裝程序,然後使用MsiExec.exe/I {guid}來卸載它們。雖然不是很好,可以管理;如果它有效,我會結束這個問題並完成。 – CC1

相關問題