Пропустите MSI, если он уже установлен

У меня есть установщик WIX, в который я устанавливаю свою программу и .NET Core 1.0.5. .NET Core устанавливается в автоматическом режиме:

<ExePackage InstallCommand="/q" Id = "DotNetCore.Setup" SourceFile="..\DotNetCore\DotNetCore.exe" />

В чистой системе установщик работает нормально. Если попробую переустановить, то получится перезагрузка. Вероятно, установщик .NET обнаружил, что он уже установлен, и самостоятельно запустил функцию восстановления. Есть ли способ пропустить установку .NET Core, если она уже установлена?

Я попытался найти параметры командной строки, но ничего полезного не показалось


person Gianluca Ghettini    schedule 24.07.2017    source источник


Ответы (2)


Элемент ExePackage имеет свойство DetectCondition. Это означает, что вы можете указать условие, при котором, если условие оценивается как ложное, пакет будет установлен. Вы можете комбинировать это с элементом util: RegistrySearch, который может использоваться для поиска в реестре, чтобы определить, установлено ли уже .NET Core.

Чтобы выполнить поиск в реестре, вам сначала нужно найти ключ реестра, который присутствует при установке .NET.

Найдите в реестре раздел «HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \» (или «HKLM \ SOFTWARE \ WOW6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall \» на 64-разрядных машинах), затем найдите подраздел что соответствует .NET Core - этот ключ должен иметь значение для «DisplayName», которое должно быть «.NET Core» или что-то подобное.

Найденный правильный ключ должен иметь имя, которое представляет собой строку шестнадцатеричных символов - это один из идентификаторов GUID, соответствующих программе .NET Core. Затем вы можете использовать следующий код, чтобы программа установки могла найти этот ключ:

<util:RegistrySearch Id="VCRedistTest32" Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{YOUR_GUID_HERE}" Result="exists" Variable="DOTNETPresent" Win64="no"/>

(Для 64-разрядного реестра используйте Win64 = "yes")

Затем вы можете использовать для ExePackage следующее:

<ExePackage InstallCommand="/q" Id = "DotNetCore.Setup" SourceFile="..\DotNetCore\DotNetCore.exe" DetectCondition="DOTNETPresent"/>

Не забудьте добавить ссылку на расширение util к элементу wix верхнего уровня:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
 xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
person Calum MacLeod    schedule 24.07.2017

Вам необходимо использовать атрибут DetectCondition и поиск в реестре, который присваивает свойство, если установлено ядро ​​.net.

Элемент ExePackage - DetectCondition

«Условие, которое определяет, присутствует ли пакет в целевой системе. Это условие может использовать встроенные переменные и переменные, возвращаемые поиском. Это условие необходимо, поскольку Windows не предоставляет метода для обнаружения наличия ExePackage. Записать использует это условие, чтобы определить, как обращаться с этим пакетом во время действия пакета; например, если это условие ложно или опущено и пакет устанавливается, Burn установит этот пакет ».

person Arkady Sitnitsky    schedule 24.07.2017
comment
ах большое спасибо! могли бы вы указать условие, чтобы определить, установлено ли ядро ​​.net? Я мог бы даже избежать условия обнаружения, если бы мог принудительно установить установку вместо установки - person Gianluca Ghettini; 24.07.2017
comment
После установки нужно проверить реестр. Полный пример вы можете посмотреть здесь firegiant.com/wix/tutorial/ net-and-net / bootstrapping - person Arkady Sitnitsky; 24.07.2017