Как определить, установлена ​​ли платформа .NET Framework 4.6.1 или выше в WiX?

В настоящее время я использую следующую разметку в моем проекте установки WiX, чтобы проверить, установлена ​​ли .NET Framework 4.5 или более.

<PropertyRef Id="NETFRAMEWORK45" />

<Condition Message="$(var.ProductName) requires .NET Framework 4.5 or higher.">
  <![CDATA[Installed OR (NETFRAMEWORK45 >= "#393295")]]>
</Condition>

Как проверить .NET Framework 4.6.1 и выше?

Я использую WiX 3.10.2.2516.

Ответ 1

Как насчет:

<PropertyRef Id="WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED" />
<Condition Message="$(var.ProductName) requires .NET Framework 4.6.1 or higher.">
  <![CDATA[Installed OR WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED]]>
</Condition>

Ответ 2

Я боюсь, что ни одно из вышеизложенных не помогло мне. Или, возможно, я не совсем понял, как реализовать предложения.

Что работало для меня, тем не менее, это была моя предыдущая проверка на .Net Framework 4.5.1, аналогичную вашей проверке на 4.5.

Просто изменив версию на целевой номер версии .Net Framework на требуемый, найденный здесь: https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx, работал у меня.

Я закончил с этим:

<PropertyRef Id="NETFRAMEWORK45"/>
<Condition Message="This application requires .NET Framework 4.6.1. Please install the .NET Framework then run this installer again.">
    <![CDATA[Installed OR (NETFRAMEWORK45 >= "#394254")]]>
</Condition>

P.S. Сегодня я внедрил это изменение, поэтому следующие несколько дней тестирования покажут мне, работает ли это или нет. Будет обновлен мой комментарий, когда у меня появятся некоторые результаты.

P.P.S. Тестирование сменило мою сторону. Установщик успешно выходит из строя в средах, где .NET Framework 4.6.1 не установлен и не устанавливается успешно. (Также: Спасибо @RamenChef, для редактирования моего сообщения: +1:)

Ответ 3

Обновить. Текущая стабильная версия WiX теперь интегрирована; этот ответ может представлять интерес, если по какой-то причине вы используете более старую версию (например, 3.10.3, которая была последней, когда это было изначально написано)


Текущая версия версии WiX (3.10.3) не поддерживает это свойство, а текущая 3.10.x ночная сборка (3.10.3.3007) - это похоже на то, что она поддерживает 3.11.0.960, но это сборка не помечена как готовая продукция, поэтому она не является вариантом для моего сценария.

То, что я закончил, - это захват источника для NetFx461.wxs(здесь) и добавления его в мой проект выпуска 3.10 после изменения это немного (см. ниже). После этого я смог использовать свойство. Вы можете сделать аналогичные изменения для 4.6.2, если это необходимо.

Здесь файл:

<?xml version="1.0" encoding="utf-8"?>
<!--
  <copyright file="NetFx461.wxs" company="Outercurve Foundation">
    Copyright (c) 2004, Outercurve Foundation.
    This software is released under Microsoft Reciprocal License (MS-RL).
    The license and further copyright text can be found in the file
    LICENSE.TXT at the root directory of the distribution.
  </copyright>
-->
<!--<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">-->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" xmlns:wxs="http://wixtoolset.org/schemas/v4/wxs">


  <!--
        .NET Framework installation state properties

        Official documentation can be found at the following location:

           .NET Framework 4.5/4.5.1/4.5.2/4.6/4.6.1 - http://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx
    -->

  <?define NetFx461MinRelease = 394254 ?>
  <?define NetFx461WebLink = http://go.microsoft.com/fwlink/?LinkId=671728 ?>
  <?define NetFx461RedistLink = http://go.microsoft.com/fwlink/?LinkId=671743 ?>

  <Fragment>
    <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
    <Property Id="WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED" Secure="yes" />
    <SetProperty Id="WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED" Value="1" After="AppSearch">
      WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx461MinRelease)"
    </SetProperty>
  </Fragment>

  <Fragment>
    <util:RegistrySearchRef Id="NETFRAMEWORK45"/>

    <WixVariable Id="NetFx461WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx461MinRelease)" Overridable="yes" />
    <WixVariable Id="NetFx461WebInstallCondition" Value="" Overridable="yes" />
    <WixVariable Id="NetFx461WebPackageDirectory" Value="redist\" Overridable="yes" />

    <PackageGroup Id="NetFx461Web">
      <ExePackage
          InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
          RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
          UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
          PerMachine="yes"
          DetectCondition="!(wix.NetFx461WebDetectCondition)"
          InstallCondition="!(wix.NetFx461WebInstallCondition)"
          Id="NetFx461Web"
          Vital="yes"
          Permanent="yes"
          Protocol="netfx4"
          DownloadUrl="$(var.NetFx461WebLink)"
          LogPathVariable="NetFx461FullLog"
          Compressed="no"
          Name="!(wix.NetFx461WebPackageDirectory)NDP461-KB3102438-Web.exe">
        <RemotePayload 
          CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0" 
          CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC" 
          Description="Microsoft .NET Framework 4.6.1 Setup" 
          Hash="EE88B05232F43B517D4A368F7EE5065CDE7F67FA" 
          ProductName="Microsoft .NET Framework 4.6.1" 
          Size="1424328" 
          Version="4.6.1055.0" />
      </ExePackage>
    </PackageGroup>
  </Fragment>

  <Fragment>
    <util:RegistrySearchRef Id="NETFRAMEWORK45"/>

    <WixVariable Id="NetFx461RedistDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx461MinRelease)" Overridable="yes" />
    <WixVariable Id="NetFx461RedistInstallCondition" Value="" Overridable="yes" />
    <WixVariable Id="NetFx461RedistPackageDirectory" Value="redist\" Overridable="yes" />

    <PackageGroup Id="NetFx461Redist">
      <ExePackage
          InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
          RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
          UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
          PerMachine="yes"
          DetectCondition="!(wix.NetFx461RedistDetectCondition)"
          InstallCondition="!(wix.NetFx461RedistInstallCondition)"
          Id="NetFx461Redist"
          Vital="yes"
          Permanent="yes"
          Protocol="netfx4"
          DownloadUrl="$(var.NetFx461RedistLink)"
          LogPathVariable="NetFx461FullLog"
          Compressed="no"
          Name="!(wix.NetFx461RedistPackageDirectory)NDP461-KB3102436-x86-x64-AllOS-ENU.exe">
        <RemotePayload
          CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0" 
          CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC" 
          Description="Microsoft .NET Framework 4.6.1 Setup" 
          Hash="83D048D171FF44A3CAD9B422137656F585295866" 
          ProductName="Microsoft .NET Framework 4.6.1" 
          Size="67681000" 
          Version="4.6.1055.0" />
      </ExePackage>
    </PackageGroup>
  </Fragment>
</Wix>

Добавьте это (скажем, NetFx461.wxs) к вашему проекту установщика WiX, и у вас будет доступ к желаемым свойствам.

Ответ 4

Значение WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED было реализовано FabienLavocat и было объединено неделю назад в соответствии с запрос на удаление GitHub

Ответ 5

Вот мое решение для этой проблемы. Я использую его для проверки .NET 4.7, но он должен работать для всех версий .NET 4.5+.

См. https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed#net_b для списка допустимых номеров версий.

Я использую поиск в реестре, чтобы установить значение свойства в ревизию среды .NET 4.x. Позже я использую это свойство хорошо известным способом проверки условия запуска:

<?define NetFx47MinRelease = 460798 ?>
<Property Id="NETFRAMEWORK47" Value="0" Secure="yes">
    <RegistrySearch
        Id="RegSearch"
        Root="HKLM"
        Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
        Name="Release"
        Type="raw" />
</Property>

<Condition Message="PPG OnBoard requires .NET Framework 4.7 installed.">
    <![CDATA[NETFRAMEWORK47 >= "#$(var.NetFx47MinRelease)"]]>
</Condition>

К сожалению, в этой ситуации RegistrySearch возвращает значение DWORD с префиксом "#", что сделало его непригодным для использования в состоянии "больше чем" в моих первых тестах. Используйте точный синтаксис "#$(var.NetFx47MinRelease)", чтобы иметь возможность сравнивать значение "больше, чем".