如何检测 WiX 中是否安装了 .NET Framework 4.6.1 或更高版本?
How can I detect whether .NET Framework 4.6.1 or higher is installed in 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。
怎么样:
<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>
WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED 值由 FabienLavocat 实现并在一周前根据 the GitHub pull request
合并
更新:目前稳定版的WiX已经集成了这个;如果出于某种原因,您使用的是旧版本(例如 3.10.3,这是最初编写时的最新版本),您可能会对这个答案感兴趣
WiX 的当前发行版 (3.10.3) 不支持此 属性,当前的 3.10.x 每晚构建 (3.10.3.3007) 也不支持 - 它看起来像3.11.0.960 确实支持它,但该版本未标记为生产就绪,因此它不是我的方案的选项。
我最终做的是获取 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 >= $(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 "[WixBundleName]" /log "[NetFx461FullLog].html""
RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html""
UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html""
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 >= $(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 "[WixBundleName]" /log "[NetFx461FullLog].html""
RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html""
UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html""
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 安装程序项目中,您将可以访问所需的属性。
恐怕以上 none 对我有用。或者我不太明白如何实施这些建议。
然而,对我有用的是我之前对 .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 的环境中成功失败,在安装了 .Net Framework 4.6.1 的环境中成功安装。
(另外:感谢@RamenChef,编辑我的 post :+1:)
这是我解决这个问题的方法。我用它来检查 .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
returns DWORD 值以“#”字符为前缀,这使得它在我的第一次测试中的 "greater than" 条件下无法使用。使用精确的 "#$(var.NetFx47MinRelease)"
语法来比较 "greater than".
我目前在我的 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。
怎么样:
<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>
WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED 值由 FabienLavocat 实现并在一周前根据 the GitHub pull request
合并更新:目前稳定版的WiX已经集成了这个;如果出于某种原因,您使用的是旧版本(例如 3.10.3,这是最初编写时的最新版本),您可能会对这个答案感兴趣
WiX 的当前发行版 (3.10.3) 不支持此 属性,当前的 3.10.x 每晚构建 (3.10.3.3007) 也不支持 - 它看起来像3.11.0.960 确实支持它,但该版本未标记为生产就绪,因此它不是我的方案的选项。
我最终做的是获取 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 >= $(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 "[WixBundleName]" /log "[NetFx461FullLog].html""
RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html""
UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html""
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 >= $(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 "[WixBundleName]" /log "[NetFx461FullLog].html""
RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html""
UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html""
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 安装程序项目中,您将可以访问所需的属性。
恐怕以上 none 对我有用。或者我不太明白如何实施这些建议。
然而,对我有用的是我之前对 .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 的环境中成功失败,在安装了 .Net Framework 4.6.1 的环境中成功安装。 (另外:感谢@RamenChef,编辑我的 post :+1:)
这是我解决这个问题的方法。我用它来检查 .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
returns DWORD 值以“#”字符为前缀,这使得它在我的第一次测试中的 "greater than" 条件下无法使用。使用精确的 "#$(var.NetFx47MinRelease)"
语法来比较 "greater than".