Как разумно установить .NET 4.x с помощью WiX Burn

При установке приложения, которое может использовать .NET 4.0 или 4.5, какова наилучшая практика при установке предустановок .NET framework? И как вы его реализуете с помощью Burn in WiX?

Это варианты и компромиссы, о которых я знаю:

Вариант 1: установите .NET 4.0 (только то, что вам нужно)

  • Преимущества: Неизвестно (кроме Windows XP, где это единственный выбор)

Вариант 2: установите .NET 4.5, если .NET 4.5 отсутствует

  • Преимущества: пользователю не нужно будет устанавливать .NET 4.5 позже для будущего Программы. Приложение не будет испытывать изменения версии .NET, когда пользователь позже сделает перейти на .NET 4.5. Приложение сразу получает улучшения производительности .NET 4.5.

Вариант 3: установите .NET 4.5, только если ни .NET 4.x не присутствует

  • Преимущества: гораздо более быстрое развертывание, чем вариант 2, если .NET 4.0 уже установлено. Если это не так, то преимущества варианта 2 применяются.

Насколько я могу судить, лучшей практикой будет вариант 2, если важны улучшения производительности и вариант 3, если важна средняя скорость развертывания. Правильно ли это звучит? Не хватает ли какого-либо преимущества для варианта 1? Самое главное, если вариант 3 имеет смысл, как его реализовать с помощью Burn при установке .NET из Интернета?

Ответы

Ответ 1

Ниже показано, как я обнаруживаю .NET в своем пакете. Обратите внимание на использование DetectConditions и InstallConditions. DetectCondition будет проверять, установлен ли конкретный пакет, а InstallCondition может использоваться для переопределения DetectCondition, чтобы указать, когда пакет должен быть установлен. Например, на XP вы не можете установить .NET 4.5, поэтому мой InstallCondition предотвращает установку в таком случае.

<util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" Value="Version" Variable="Netfx4FullVersion" />
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" Value="Version" Variable="Netfx4x64FullVersion" Win64="yes" />

<!-- .NET 4.5 only installed if Vista or higher AND it not already installed-->
<PackageGroup Id="Netfx45">
  <ExePackage Id="Netfx45" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes" InstallCommand="/q"
              SourceFile="C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX45Full\dotnetfx45_full_x86_x64.exe"
              DetectCondition="(Netfx4FullVersion=&quot;4.5.50709&quot;) AND (NOT VersionNT64 OR (Netfx4x64FullVersion=&quot;4.5.50709&quot;))"
              InstallCondition="(VersionNT >= v6.0 OR VersionNT64 >= v6.0) AND (NOT (Netfx4FullVersion=&quot;4.5.50709&quot; OR Netfx4x64FullVersion=&quot;4.5.50709&quot;))"/>
</PackageGroup>
<!-- .NET 4.0 only installed if XP AND it not already installed -->
<PackageGroup Id="Netfx4Full">
  <ExePackage Id="Netfx4Full" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes" InstallCommand="/q"
              SourceFile="C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX40\dotNetFx40_Full_x86_x64.exe"
              DetectCondition="Netfx4FullVersion AND (NOT VersionNT64 OR Netfx4x64FullVersion)"
              InstallCondition="(VersionNT &lt; v6.0 OR VersionNT64 &lt; v6.0) AND (NOT (Netfx4FullVersion OR Netfx4x64FullVersion))"/>
</PackageGroup>

Затем, если вы хотите установить один из пакетов, просто укажите его в своей цепочке:

<Chain>
  <PackageGroupRef Id='Netfx45'/>
</Chain>

Что касается вашего конкретного вопроса, я бы установил любую версию фреймворка, с которым было проверено приложение. Если он протестирован как на .NET 4.0, так и на .NET 4.5, я полагаю, что это решение, однако я попытался бы максимально упростить настройку. Поэтому, если .NET 4.0 уже был установлен и приложение не требует .NET 4.5, я бы не установил его.

Кроме того, есть недостаток в Варианте 2, если вы используете собственное приложение Managed Bootstrapper. Скажем, у вас установлен .NET 4.0, а для управляемого загрузочного загрузчика требуется .NET 4.0 (или выше). Когда вы запустите установщик, он установит .NET 4.5, который заменит .NET 4.0, заставив ваш установщик перезагрузиться на полпути, потому что он использовал .NET framework в то же время, когда он обновлялся. Опять же, это только проблема, если вы используете собственный собственный управляемый загрузчик.