Проблемы, связанные с установкой приложения через установщик Windows - PullRequest
6 голосов
/ 06 июня 2011

У меня есть установщик Windows для моего приложения. Пакет приложения также содержит класс Installer, где некоторые действия выполняются, другие выполняются в пользовательских действиях.

Установщик устанавливает другое приложение из пользовательских действий во время установки. Я хочу знать, если это приложение уже существует той же версии, я не хочу устанавливать или предоставлять запрос окна сообщения для переустановки Y / N.

Если мое приложение уже установлено и я снова нажимаю на тот же установщик, я получаю опции «Восстановить» и «Удалить». Но если программа установки была только что построена, я получаю диалоговое окно с сообщением «Другая версия уже установлена ​​... удалите, используя« Установка и удаление программ ».». Поэтому я не могу обновить существующую версию, не удалив ее. Как я могу обновить существующую версию?

Любая помощь или руководство по этим 2 запросам высоко ценится. Я искал в сети для них, но не мог получить ответы apropriae. Если бы вы могли мне помочь, это было бы действительно здорово.

КОД

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, если он не установлен на компьютере. С кодом выше он не устанавливается как предварительное условие. В Prerequisite я выбираю свое приложение (вместе с установщиком Windows 3.1 и .NET3.5) и выбираю «Загрузить prereq из того же места, что и мое приложение». При сборке проекта установки я получаю 3 папки в своем Rel (для winIns Net и мое приложение должны быть установлены как preq, то есть XYZ). В настоящее время XYZ не установлен на моем компе - поэтому ключ не будет найден. Когда я устанавливаю установщик, он устанавливает приложение, но не приложение prereq i.e XYZ.exe. Куда я иду не так?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 06 июня 2011

Установщик устанавливает другое приложение из пользовательских действий во время установки.Я хочу знать, если это приложение уже существует той же версии, я не хочу устанавливать или предоставлять запрос окна сообщения для переустановки Y / N.

Вместо настраиваемого действия вы должны использовать предварительное условие.Если вы используете проект установки Visual Studio, возможно, это поможет: Добавление пользовательских предварительных условий в проект установки Visual Studio

Если вы используете другой инструмент настройки установки, вы должны выяснить, если онподдерживает предварительные условия или нет.

Если мое приложение уже установлено и я снова нажимаю на тот же установщик, я получаю опции «Восстановить» и «Удалить».Но если программа установки была только что построена, я получаю диалоговое окно с сообщением «Другая версия уже установлена ​​... удалите, используя« Установка и удаление программ ».».Поэтому я не могу обновить существующую версию, не удалив ее.Как я могу обновить существующую версию?

Это происходит потому, что вы изменили пакет без увеличения ProductVersion и изменения ProductCode.Если вы хотите автоматическое обновление, вам нужно изменить их.

Однако, если вы только тестируете и не хотите увеличивать ProductVersion, вам необходимо вручную удалить старый пакет перед установкой нового.Так работают обновления установщика Windows.

0 голосов
/ 06 июня 2011
  1. Вы можете проверить версию исполняемых файлов, используя GetFileVersionInfo и VerQueryValue WinAPI-функции (должны быть .Net-аналоги).

  2. Вы можете изменять ProductCode каждый раз при создании пакета MSI.Обновления должны включать текущую версию, т. Е. Вам нужно разрешить обновления между одной и той же версией пакета без изменения ProductVersion.Тем не менее, я бы рекомендовал после рекомендации Космина .


Обновление : отвечая на комментарий.

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

...