2011-06-06 156 views
6

我有適用於我的應用程序的Windows安裝程序。應用程序包還包含安裝程序類,其中執行的某些操作在「自定義操作」中執行。有關通過Windows安裝程序安裝應用程序的問題

安裝過程中,安裝程序會從自定義操作中安裝另一個應用程序。我想知道這個應用程序是否已經存在相同的版本,我不想安裝或提供Messagebox asknig來重新安裝Y/N。

如果我的應用程序已經安裝,並且再次點擊相同的安裝程序,我會得到「修復」和「刪除」選項。但是,如果安裝程序是新建的,我會看到一個對話框,指出「已安裝另一個版本...使用添加刪除程序刪除..」。所以我不能在不卸載它的情況下更新現有版本。我如何更新現有版本?

任何幫助或指導這兩個查詢,高度讚賞。我在網上看了這些,但不能得到apropriae答案。如果你能幫助我,那真是太好了。

CODE

prouct.xml

<?xml version="1.0" encoding="utf-8" ?> 
<Product xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" 
ProductCode="My.Bootstrapper.ABC"> 

<!-- Create Package, Product Manifest http://msdn.microsoft.com/en-us/library/ee335702.aspx 
    Schema Reference : http://msdn.microsoft.com/en-us/library/ms229223.aspx 
    --> 

<PackageFiles> 
    <PackageFile Name="XYZ.exe"/> 
</PackageFiles> 

<InstallChecks> 
    <!-- If its installed, it will be in Uninstall. DisplayName will be XYZ2.1_rc22 
    Can still get values of DisplayVersion (2.1_rc22) & UninstallString from this key 
    --> 
    <RegistryCheck 
     Property="IS_XYZ_INSTALLED" 
     Key="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\XYZ" 
     Value="DisplayName"/> 
    </InstallChecks> 

    <Commands> 
    <Command PackageFile="XYZ.exe" Arguments="/Install"> 
    <InstallConditions> 
     <BypassIf Property="IS_XYZ_INSTALLED" 
      Compare="ValueEqualTo" Value="XYZ2.1_rc22"/> // tHIS IS THE DISPLAYNAME, THAT I SEE IN REGISTY 
     <FailIf Property="AdminUser" 
      Compare="ValueNotEqualTo" Value="True" 
      String="NotAnAdmin"/> 
    </InstallConditions> 

    <ExitCodes> 
     <ExitCode Value="0" Result="Success"/> 
     <ExitCode Value="1641" Result="SuccessReboot"/> 
     <ExitCode Value="3010" Result="SuccessReboot"/> 
     <DefaultExitCode Result="Fail" String="GeneralFailure"/> 
    </ExitCodes> 
    </Command> 
</Commands> 

</Product> 

package.xml中

<?xml version="1.0" encoding="utf-8" ?> 
<Package xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" 
    Name="DisplayName" Culture="Culture"> 

<!--Check for XYZversion 2.1_rc22 --> 
<Strings> 
    <String Name="DisplayName">Install My XYZ</String> 
    <String Name="Culture">en</String> 
    <String Name="NotAnAdmin">Administrator permissions are required to install XYZ.Contact your 
       administrator.</String> 
    <String Name="GeneralFailure">A general error has occurred while installing this 
      package.</String> 
    </Strings> 
</Package> 

UPDATE: 我想安裝XYZ如果不alerady安裝PC。使用上面的代碼,它不會作爲先決條件安裝。在先決條件中,選擇我的應用程序(以及Windows Installer 3.1 & .NET3.5),並選擇「從與我的應用程序相同的位置下載prereq」。在安裝項目的構建中,我在Rel中獲得3個文件夾(對於winIns,我的應用程序是Net &,或者作爲preq安裝,即XYZ)。目前XYZ未安裝在我的電腦上 - 因此找不到密鑰。當我安裝安裝程序時,它會安裝應用程序,但不會安裝prereq,即XYZ.exe應用程序。我哪裏錯了?

謝謝。

+0

它如何在自定義操作中安裝其他應用程序,它是另一個MSI嗎? – Jodrell 2011-06-06 08:32:51

+0

@Jodrell,另一個應用程序是一個Windows安裝程序文件。在自定義操作中,我在安裝下添加了該場景。因此,它執行時,安裝過程和exe文件安裝其他應用程序 – Tvd 2011-06-06 13:25:22

回答

0
  1. 您可以檢查使用GetFileVersionInfoVerQueryValue WinAPI的功能的可執行文件的版本(必須有淨同行)。

  2. 您每次生成MSI軟件包時都可以更改ProductCode。升級必須包含當前版本,即您需要允許在相同版本的軟件包之間進行升級,而無需更改ProductVersion

    但我會推薦關注Cosmin's recommendation


更新:回答進行評論。

<Upgrade Id="Your-Upgrade-GUID"> 
    <UpgradeVersion Minimum="$(var.ProductVersion)" 
        IncludeMinimum="no" 
        OnlyDetect="yes" 
        Language="1033" 
        Property="NEWPRODUCTFOUND" /> 
    <!-- NEWPRODUCTFOUND property is set if a newer product version 
     is installed. It is used to prevent downgrades. --> 

    <UpgradeVersion Minimum="1.0.0" 
        IncludeMinimum="yes" 
        Maximum="$(var.ProductVersion)" 
        IncludeMaximum="yes" 
        Language="1033" 
        Property="UPGRADEFOUND" /> 
    <!-- UPGRADEFOUND property is set if older product version is installed 
     or the same as the value of ProductVersion variable --> 
</Upgrade> 

我們使用上面的代碼甚至可以在相同版本的應用程序之間執行升級。 ProductVersion是一個包含當前版本的產品的WiX預處理器變量。每個構建自動生成PackageCode,使用*作爲其在.wsx文件中的值。

使其工作的關鍵是第二個UpgradeVersion元素中的IncludeMaximum="yes"屬性以及每個生成的包都具有唯一的PackageCode的事實。

+0

@Alexey,我該如何處理我的應用升級。我是否必須更改產品代碼或升級版本?然後,如果是升級,則安裝路徑應該不允許更改自動廣告。如何在安裝程序中獲取?我也有安裝程序類。 – Tvd 2011-06-06 13:31:13

+0

@Tvd,我已經更新了提供WiX代碼片段的答案,這使得可以在不更新產品版本的情況下升級當前版本的安裝。 – 2011-06-07 11:50:52

+0

@alexey,謝謝。但是我使用Windows Installer使用VS 2008使用SEtu&Deployment。如何在安裝和部署項目中執行相同的操作。當你推薦Cosmins的建議時,你能看看代碼和我在Cosmin答案下添加的評論。或者如何使用安裝和部署窗口安裝程序MSI處理上述問題。真的很感激。 – Tvd 2011-06-07 13:30:46

3

的安裝程序安裝的自定義操作過程中 另一 應用程序安裝。我想知道這個 應用程序是否已經存在相同的 版本我不想安裝或者 提供了一個MessageBox詢問到 重新安裝Y/N。

而不是自定義操作,您應該使用先決條件。如果您正在使用Visual Studio安裝項目,可能會對此有所幫助:Adding Custom prerequsites to visual studio setup project

如果您使用的是其他安裝創作工具,您應該瞭解它是否支持先決條件。

如果我的應用程序已經安裝 ,我再次點擊同一 安裝,我得到「修復」和 「刪除」選項。但是,如果安裝程序 是新建的,我會得到一個對話框,說明 「另一個版本已安裝 ...使用添加刪除 程序刪除..」。所以我無法更新它的存在版本,而無需卸載它。我如何更新現有的 版本?

發生這種情況是因爲您修改了包而未增加ProductVersion並修改ProductCode。如果你想要自動升級,你需要修改它們。

但是,如果您只是測試並且不想增加ProductVersion,則需要在安裝新軟件包之前手動卸載舊軟件包。這是Windows Installer升級的工作方式。

+0

@Cosmin,我不知道如何使用/配置引導清單與我的應用程序。我正在使用Windows Installer。我的應用程序名稱是「ABS.exe」,我正在安裝的另一個應用程序是由我定製的「XYZ.exe」。系統可能有其原始完整版本。我構建的應用程序的exe文件名稱與原始完整版exe文件名稱相同。我通過識別安裝路徑中的文件和文件夾名稱來識別我的內置版本。有了這個複雜的我無法弄清楚如何使用自定義的Prerequsites。你能幫我解決嗎?我想我一直都在迷失方向。 – Tvd 2011-06-06 13:16:54

+0

@Cosmin,REG「另一個版本已經安裝......」。無論如何要處理這個問題。我的意思是我可以給自定義消息而不是系統消息。這可以處理,如果是的話如何處理這部分? – Tvd 2011-06-06 13:27:39

+0

我假設你的其他應用程序有不同的安裝程序。在這種情況下,您可以添加第二個安裝程序作爲先決條件。如果您爲兩個應用程序使用單個軟件包,爲什麼以及如何從自定義操作中安裝它?關於消息,你不能改變它或處理它。您可以增加版本並更改產品代碼,也可以手動卸載舊版本。 – 2011-06-06 14:16:37