【问题标题】:Issues regarding Installing an Application via Windows Installer关于通过 Windows Installer 安装应用程序的问题
【发布时间】:2011-06-06 08:12:20
【问题描述】:

我的应用程序有一个 Windows 安装程序。应用程序包还包含安装程序类,其中一些操作在自定义操作中执行,其他操作在其中执行。

安装程序在安装期间从自定义操作安装另一个应用程序。我想知道这个应用程序是否已经存在我不想安装的相同版本或提供消息框询问重新安装 Y/N。

如果我的应用程序已经安装,并且我再次单击相同的安装程序,我会看到“修复”和“删除”选项。但是,如果安装程序是新建的,我会收到一个对话框,说明“已安装另一个版本......使用添加删除程序删除......”。所以我不能在不卸载它的情况下更新现有版本。如何更新现有版本?

我们非常感谢您对这两个查询的任何帮助或指导。我在网上寻找这些但无法得到适当的答案。如果你能帮助我,那就太好了。

代码

产品.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>

更新: 如果 XYZ 没有安装在 PC 上,我想安装它。使用上面的代码,它不会作为先决条件安装。在先决条件中,我选择了我的应用程序(以及 Windows Installer 3.1 和 .NET3.5)并选择了“从与我的应用程序相同的位置下载 prereq”。在构建安装项目时,我在我的 Rel 中获得了 3 个文件夹(对于 winIns、Net 和我的应用程序,o 安装为 preq,即 XYZ)。目前我的电脑上没有安装 XYZ - 所以找不到密钥。当我安装安装程序时,它会安装应用程序而不是 prereq,即 XYZ.exe 应用程序。我哪里错了?

谢谢。

【问题讨论】:

  • 如何在自定义操作中安装其他应用程序,是不是另一个微星?
  • @Jodrell,另一个应用程序是 Windows 安装程序文件。在自定义操作中,我在安装下添加了该字段。因此它在安装过程中执行,exe文件安装其他应用程序

标签: c# windows installation


【解决方案1】:

安装程序安装另一个 期间从自定义操作应用程序 安装。我想知道这是否 相同的应用程序已经存在 我不想安装的版本或 提供一个消息框询问 重新安装是/否。

您应该使用先决条件,而不是自定义操作。如果您使用的是 Visual Studio 安装项目,也许这会有所帮助:Adding Custom prerequsites to visual studio setup project

如果您使用其他设置创作工具,您应该了解它是否支持先决条件。

如果我的申请已经 安装,我点击相同 再次安装程序,我得到“修复”和 “删除”选项。但是如果安装程序 是新建的,我得到一个对话框说明 "已经安装了另一个版本 ... 使用添加删除删除 程序..”。所以我无法更新 没有卸载的现有版本 它。如何更新现有的 版本?

发生这种情况是因为您在未增加 ProductVersion 和修改 ProductCode 的情况下修改了包。如果您想要自动升级,则需要对其进行修改。

但是,如果您只是在测试并且不想增加 ProductVersion,则需要在安装新包之前手动卸载旧包。这就是 Windows Installer 升级的工作方式。

【讨论】:

  • @Cosmin,我不知道如何在我的应用中使用/配置引导清单。我正在使用 Windows 安装程序。我的应用程序名称是“ABS.exe”,而我正在安装的另一个应用程序是“XYZ.exe”,它是我自定义构建的。该系统可能有其原始完整版本。我构建的应用程序的 exe 文件名与原始完整版 exe 文件名相同。我通过从安装路径中识别文件和文件夹名称来识别我的构建版本。有了这个复杂的东西,我无法弄清楚如何使用自定义的 Prerequsites。你能帮帮我吗?我想我迷失了所有这些。
  • @Cosmin, REG "另一个版本已经安装..."。有没有办法处理这个。我的意思是我可以提供自定义消息而不是该系统消息。这个可以处理吗,如果可以怎么处理这部分?
  • 我假设您的其他应用程序有不同的安装程序。在这种情况下,您可以添加第二个安装程序作为先决条件。如果您为两个应用程序使用一个包,为什么以及如何通过自定义操作安装它?关于消息,您无法更改或处理它。要么增加版本并更改产品代码,要么手动卸载旧版本。
  • 另一个应用程序有一个安装程序(exe 文件),虽然它是我自定义构建的,并且根据我的应用程序需要准备了安装程序。在自定义操作中,在安装下,我从应用程序文件夹中添加了该 exe 文件。我只是想确保如果已经安装了相同版本的其他应用程序,我的安装程序不会再次安装它。就是这样。为此,我必须使用 produst Manifest 或 Package Manifest ??
  • 是的,只有在未找到前提条件时才会安装它。您可以将其他安装程序作为先决条件添加到您的主包中。
【解决方案2】:
  1. 您可以使用GetFileVersionInfoVerQueryValue WinAPI函数检查可执行文件的版本(必须有.Net对应)。

  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 这一事实。

【讨论】:

  • @Alexey,我该如何处理我的应用程序升级。我是否也必须更改产品代码或版本才能升级?然后如果是升级,那么安装的路径应该是自动广告不允许更改的。如何在安装程序中获得它?我也有 Installer 类。
  • @Tvd,我已经更新了提供 WiX 代码 sn-p 的答案,这使得在不更新产品版本的情况下升级当前版本安装成为可能。
  • @alexey,谢谢。但是我使用 Windows Installer 使用 SEtu 和使用 VS 2008 的部署。如何对设置和部署项目做同样的事情。当您推荐 Cosmins 的建议时,您能否看一下 Cosmin 的答案下添加的代码和我的 cmets。或如何使用设置和部署 windows 安装程序 MSI 处理上述问题。真的很感激。
  • @Tvd 不幸的是,我不知道如何使用设置和部署项目来做到这一点。引导程序对我来说看起来不错。也许它使卸载中的注册表项错误。或者您的先决条件没有将任何条目写入注册表,是吗?
  • @Alexey,我如何检查可执行文件的版本并在自定义操作中安装时安装?我有一个添加“搜索目标机器”的想法。使用密钥,我在属性中获得了版本。但是,我怎样才能在自定义操作中添加该条件 - 因为我觉得条件适用于 CustomActions 中的 CustomActionData...
猜你喜欢
  • 2012-06-20
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
相关资源
最近更新 更多