【问题标题】:How can I detect whether .NET Framework 4.6.1 or higher is installed in WiX?如何检测 WiX 中是否安装了 .NET Framework 4.6.1 或更高版本?
【发布时间】:2016-05-23 21:41:50
【问题描述】:

我目前在我的 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。

【问题讨论】:

标签: wix .net-framework-version


【解决方案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>

【讨论】:

  • 您可以随时查看 netfxextension 的实际 wix 源,以查看可能使用的任何其他属性。 github.com/wixtoolset/wix3/blob/develop/src/ext/NetFxExtension/… 在尝试模拟 wix 所做的事情时也非常有帮助,但出于另一个目的,因为您可以看到他们使用的实际代码。
  • 有 WIX_IS_NETFRAMEWORK_46_OR_LATER_INSTALLED,但没有 WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED。
  • 好的。正如 mj2008 所指出的,它看起来可以在较新的版本中使用,因此可能很快就会在稳定版本中结束。
  • 目前它不在稳定版本中,而且看起来它不会集成到 3.10.x 中(夜间 3.10.x 版本没有它,只有 3.11。 X)。请参阅下面的答案以解决问题。
【解决方案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>

附:我今天实施了更改,因此接下来几天的测试将向我揭示它是否有效。当我有一些结果要分享时会更新我的评论。

附言测试已经成功了。安装程序在未安装 .Net Framework 4.6.1 的环境中成功失败,并在已安装的环境中成功安装。 (另外:感谢@RamenChef,编辑我的帖子:+1 :)

【讨论】:

  • 我在“产品:*”部分收到错误“属性:NETFRAMEWORK45”。不见了。
  • 您是否在 Wix xml 节点的顶部包含以下内容?:code(xmlns:netfx="schemas.microsoft.com/wix/NetFxExtension") 它对我来说是什么样的:code(schemas.microsoft.com/wix/NetFxExtension" xmlns:util="schemas.microsoft.com/wix/UtilExtension">你的 wix xml )
  • 啊,我需要向 WixNetFxExtension.dll 添加一个引用,以便 xml 引用正常工作。感谢您的回复。
  • Windows 10 上的 .NET 4.6 和更高版本的版本号与以前版本的 Windows 不同。
  • 没错。您可以在我的解决方案中提到的链接中提到的 Microsoft 网络链接上找到版本号。又来了:msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx
【解决方案3】:

更新:当前稳定版的 WiX 现已集成此功能;如果由于某种原因您使用的是旧版本(例如 3.10.3,这是最初编写时的最新版本),这个答案可能会很有趣


当前版本的 WiX (3.10.3) 不支持此属性,当前的 3.10.x nightly build (3.10.3.3007) 也不支持 - 看起来 3.11.0.960 确实支持它,但build 未标记为生产就绪,因此它不是我的方案的选项。

我最终做的是获取 NetFx461.wxs (here) 的源代码,并在稍微修改后将其添加到我的 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 安装程序项目中,您就可以访问所需的属性。

【讨论】:

  • 它在 Windows 7 x86 上对我不起作用。当我运行安装程序时,它的行为就像未安装 .NET 4.6.1。在 Win10 x64 上也是如此
  • 它正在查找的键的注册表值是什么?另外,你确定安装了 4.6.1 吗?
  • 是的,我安装了 .NET 4.6.1 并且我现在签入 msi 工作正常。我从@Sascha answer 实施了解决方案,它工作正常。上面的答案对我不起作用。您的答案看起来正确,但实际上它对我不起作用。我没有深入细节,因为我找到了另一种解决方案。
【解决方案4】:

WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED 值由 FabienLavocat 实现,并在一周前根据the GitHub pull request合并

【讨论】:

  • 我无法找到它已集成到哪个版本中。您知道它是哪个版本吗?谢谢。
  • 此时它不在当前稳定的生产版本中 - 请参阅我的解决方法。
【解决方案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)" 语法来比较“大于”。

【讨论】:

  • 这在 Windows 10 x64 上不起作用。该键不在我的注册表中。
猜你喜欢
  • 1970-01-01
  • 2010-09-23
  • 2011-07-08
  • 2011-06-16
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多