2017-01-09 9 views
1

У меня есть немного состояние с версией моего WiX Bootstrapper, который находится вне поля, и я изо всех сил пытаюсь понять, как я могу обойти моя проблема с новой версией.Wix/Burn - условие, чтобы не запускать MSIPackage и, следовательно, не удалять приложение

В основном версия, которая там есть несколько элементов MSIPackage, который устанавливает SQL CLR & SMO с использованием стандартного MSIS Mircosoft в (SQLSysClrTypes.msi & SharedManagementObjects.msi) - но, к сожалению, они версии x64. Теперь это нормально для 64-битных ПК (так как наше приложение может использовать 64-битную версию), и так на этих ПК все в порядке. Но, очевидно, когда кто-то пытается и устанавливает его на 32-битной машине, он терпит неудачу.

Итак, что я хочу, чтобы новый setup.exe сделал; заключается в обнаружении, установлена ​​ли 64-разрядная версия & - это версия (которую я делаю с помощью поиска в реестре); если это так, то ничего не делайте (т.е. не устанавливайте версию x86). Также определите, установлена ​​ли версия x86 & это версия (опять я могу это сделать) - тогда установите только версию x86; если установлен ни x86 или x64 версия (или они не правильный вариант - в этом случае v13.0.1601.5)

Моя логика для этого была:

<util:RegistrySearch Id="IsSMOInstalledx86" 
     Root="HKLM" 
     Key="SOFTWARE\Microsoft\Microsoft SQL Server\SharedManagementObjects\CurrentVersion" 
     Value="Version" 
     Result="value" 
     Variable="SMOVersionx86"/> 

<util:RegistrySearch Id="IsSMOInstalledx64" 
     Root="HKLM" 
     Key="SOFTWARE\Microsoft\Microsoft SQL Server\SharedManagementObjects\CurrentVersion" 
     Value="Version" 
     Win64="yes" 
     Result="value" 
     Variable="SMOVersionx64"/> 

и

 <MsiPackage SourceFile="$(var.DependenciesPath_Microsoft)\System CLR Types for SQL Server 2016\v13.0.1601.5\SQLSysClrTypes.msi" 
       Id="SQLCLR" 
       DisplayName="System CLR Types for SQL Server 2016" 
       Visible="yes" 
       InstallCondition="(SMOVersionx86 &lt;&gt; &quot;13.0.1601.5&quot;) AND (SMOVersionx64 &lt;&gt; &quot;13.0.1601.5&quot;)" 
       SuppressSignatureVerification="yes"/> 

    <MsiPackage SourceFile="$(var.DependenciesPath_Microsoft)\Shared Management Objects\v13.0.1601.5\SharedManagementObjects.msi" 
       Id="SQLSMO" 
       After="SQLCLR" 
       DisplayName="Shared Management Objects for SQL Server 2016" 
       Visible="yes" 
       InstallCondition="(SMOVersionx86 &lt;&gt; &quot;13.0.1601.5&quot;) AND (SMOVersionx64 &lt;&gt; &quot;13.0.1601.5&quot;)" 
       SuppressSignatureVerification="yes"/> 

Но моя проблема заключается в том, что, когда это выполняется на 64-битном ПК (где SMO уже установлено), InstallCondition оценивает значение FALSE и, как четко указывает документация WiX; если он оценивается как ЛОЖЬ, тогда продукт НЕИНСТАЛИРОВАН - это, очевидно, не то, что я хочу.

Никогда не было ситуации, когда я хочу, чтобы InstallCondition оценивал значение FALSE, т.е. я никогда не должен удалять SMO (если не по какой-либо другой причине, чем пользователь мог установить, что для другого приложения использовать, а не из нашего) , Я мог бы удалить installCondition, а затем просто установил версию x86 на 32-битных и 64-битных машинах - это нормально; но немного нахаль.

Итак, что я хочу сделать в псевдо-код, это что-то вроде:

If SMOVersionx86 <> "13.0.1601.5" AND SMOVersionx64 <> "13.0.1601.5" 
then 
    call the MSIPackages (with no installcondition or always TRUE) to INSTALL 
else 
    don't call the MSIPackages" 
Endif 

т.е. если результаты состояния в FALSE; то я не хочу ничего делать ... конечно, не хочу вызывать MSIPackages с FALSE, так как это НЕ УДАЛИТЬ их.

Я изо всех сил пытаюсь развить мозги, но все они в некоторых обстоятельствах приводят к тому, что installCondition оценивает значение false и, таким образом, удаляет SMO. Я подумал, что, возможно, у меня может быть некоторая логика, которая устанавливает версию x64 на 64-битном ПК и версию x86 на 32-битном ПК, но даже тогда хотя бы одно из условий установки MSIPackage будет оцениваться как ложное и в конечном итоге удалит версию!

Любая помощь на этом будет с благодарностью принята !!

Cheers,

Big Chris.

ответ

0

MsiPackage has a property Permanent, который объявляет, можно ли удалить пакет. Установка этого параметра на «да» предотвратит попытку удаления пакета.

Однако я не уверен, что добавление этого свойства в новый пакет предотвратит удаление старого пакета.