有关通过Windows Installer安装应用程序的问题

时间:2011-06-06 08:12:21

标签: c# windows installer

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

安装程序在安装期间从“自定义操作”安装另一个应用程序。我想知道这个应用程序是否已存在相同版本我不想安装或提供Messagebox asknig重新安装Y / N.

如果我的应用程序已经安装,并且我再次单击相同的安装程序,我会得到" Repair"和"删除"选项。但是如果安装程序是新构建的,我会得到一个对话框,说明"已经安装了另一个版本...使用Add Remove Programs删除..."。因此,我无法在不卸载的情况下更新exisitng版本。如何更新现有版本?

对这两个查询的任何帮助或指导都非常感谢。我在网上查看了这些,但无法获得适当的答案。如果你能帮助我,那真的很棒。

代码

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>

更新: 我想安装XYZ,如果它不是安装在PC上的alerady。使用Above代码,它不会作为先决条件安装。在先决条件中,我选择了我的应用程序(以及Windows Installer 3.1和.NET3.5),并从与我的appli&#34;相同的位置选择了#34; Download prereq。在构建安装项目时,我在我的Rel中获得3个文件夹(对于winIns,Net&amp;我的应用程序将作为preq安装,即XYZ)。目前我的comp上没有安装XYZ - 因此找不到密钥。当我安装安装程序时,它会安装应用程序,但不安装先决条件,即XYZ.exe应用程序。我哪里错了?

谢谢。

2 个答案:

答案 0 :(得分:3)

  

安装程序安装另一个   自定义操作的应用程序   安装。我想知道这是不是   应用程序已经存在相同   版本我不想安装或   提供一个Messagebox asknig   重新安装Y / N。

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

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

  

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

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

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

答案 1 :(得分:0)

  1. 您可以使用GetFileVersionInfoVerQueryValue WinAPI函数检查可执行文件的版本(必须有.Net版本)。

  2. 每次生成MSI包时,您都可以更改ProductCode。升级必须包括当前版本,即您需要允许在相同版本的软件包之间进行升级,而无需更改ProductVersion

    但我会在Cosmin's recommendation之后推荐


  3. 更新:回复评论。

    <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文件中的值。

    使其运行的关键是第二个IncludeMaximum="yes"元素中的UpgradeVersion属性以及每个生成的包具有唯一PackageCode的事实。