2011-06-06 155 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