2010-11-03 21 views
8
  1. 我有一個Windows應用程序項目 (A.exe時)調用另一個項目 類庫(B.DLL)。安裝項目不替換部件文件

  2. A.exe有一個按鈕(myButton) 從B.dll調用方法Method1。

  3. 要安裝應用程序,我創建 安裝項目ASetup.vdproj,其 主要輸出是項目A.

  4. 編譯安裝後,安裝 運行沒有任何問題 ,當A.exe時開始和我 單擊myButton,應用程序給出 沒有錯誤。

  5. 然後,我改變B.DLL並增加了一個新的方法 方法2。

  6. myButton現在調用Method2從 B.dll而不是Method1。

  7. 我增加A.exe時和 ASetup.vdproj的 增量版本的版本,但不增加 B.DLL的版本。

  8. 安裝應用程序後,我注意到 我 A.exe時控制面板中的兩個安裝 - >添加/ 刪除程序。

  9. 當運行A.exe時,點擊 myButton的我得到一個錯誤,「該 方法方法2中未發現 B.DLL」,這意味着安裝程序 不 安裝過程中替換B.DLL。

  10. 我運行卸載,我注意到 文件沒有從磁盤上刪除 。

我的問題是:

爲什麼沒有第二個安裝更新B.DLL? 如果B.dll的版本增加,B.dll將在安裝過程中被替換,但問題是我的當前項目有許多外部程序集,如果它們已被修改或難以控制,則很難控制。基本上,我想要的是所有的程序集文件都在每個安裝中被替換。

我等待大家的反饋。 謝謝大家的關注。

回答

6

中添加2項/刪除程序告訴我,你改變了產品代碼屬性,但沒有在升級表中的有效行正確定義的重大升級。 MSI將其視爲兩種不同的產品,它們恰好安裝到同一個目錄中。當您卸載兩個產品中的一個時,這些文件將保留,直到您卸載其他產品。

未被覆蓋的DLL向我暗示,您沒有將AssemblyFileVersion屬性從一個構建更改爲另一個構建。第一次在1.0.0.0中安裝副本,第二次安裝說「1.0.0.0已經存在,這裏沒有什麼可做」並跳過它。

2

除了@Christopher Painter提到的問題之外,還存在另一個問題:使用Visual Studio(2008)創建的安裝項目只會在版本號增加時替換文件。顯而易見的解決方案是隻增加所有版本號;然而,這可能並不總是你想要的。

.msi文件的行爲基本上取決於執行RemoveExistingProducts操作的時刻。使用VS 2008創建的安裝程序在安裝新產品後安排此操作。其版本尚未增加的修改後的程序集因此不會被替換。有關該更新的行爲更多的細節在此線程描述:

RemovePreviousVersions=True but previous version is not removed from the target machine

要改變行爲,可以修補,以使RemoveExistingProducts動作的前執行創建的.msi文件新產品被安裝(如果您使用Visual Studio 2005創建安裝程序,這實際上就是行爲)。修補可以例如使用運行作爲後步建一個小的VBScript來完成:

Dim objInstaller 
Dim objDatabase 
Dim objView 
Dim objResult 

Dim strPathMsi 

If WScript.Arguments.Count <> 1 Then 
    WScript.Echo "Usage: cscript fixRemovePreviousVersions.vbs <path to MSI>" 
    WScript.Quit -1 
End If 

strPathMsi = WScript.Arguments(0) 

Set objInstaller = CreateObject("WindowsInstaller.Installer") 
Set objDatabase = objInstaller.OpenDatabase(strPathMsi, 1) 
Set objView = objDatabase.OpenView("UPDATE InstallExecuteSequence SET Sequence=1450 WHERE Action='RemoveExistingProducts'") 

WScript.Echo "Patching install sequence: UPDATE InstallExecuteSequence SET Sequence=1450 WHERE Action='RemoveExistingProducts'" 
objView.Execute 
objDatabase.Commit 

WScript.Quit 0 
+1

我已經打倒VDPROJ這條道路,在任何時候,你會甲肝幾十這些postbuild腳本來解決的事實,VDPROJ吮吸。現在將VDPROJ轉儲爲另一種工具(WiX或IS 2010 LE),您將擁有更長的使用壽命。 :-)順便說一句,在我的CM專家說,故意運送2個MSI與具有相同文件版本的不同程序集是瘋了。可追溯性至關重要。 – 2010-11-03 13:05:59

+0

@Christopher Painter:這都是非常真實的。 – 2010-11-03 13:09:10

+0

這個「SET Sequence = 1450」命令的意義是什麼?有沒有辦法查看我認爲嵌入MSI某處的「數據庫」? – Qwertie 2013-07-19 22:36:29

相關問題