检测.NET 4.5.1和未来向后兼容的版本

时间:2014-08-12 06:58:22

标签: .net .net-framework-version

根据MSDN文章How to: Determine Which .NET Framework Versions Are Installed中列出的指导,我编写了一个WiX安装程序来检查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\Release注册表项以确定是否已安装.NET 4.5.1,并使用该检测设置先决条件。

我现在遇到的问题是,当安装了.NET 4.5.2时,同一个密钥不再是378675378758,而是现在379893。 .NET 4.5.2应该是“高度兼容的就地更新”,但推荐的版本检查算法不是向后兼容的。

检查以前的版本没有此问题,即使安装了更高版本,2.0,3.0和3.5注册表项仍然存在。例如即使安装了3.5,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Version仍然存在。

之前,Microsoft推荐的版本检测方法是向前兼容的,但4.5 / 4.5.1 / 4.5.2不再是这种情况。那么,我应该做什么呢?我不愿意将379893(.NET 4.5.2)添加到我检查的注册表值集中,因为当(如果).NET 4.5.3(或其他)发布时,这可能会失败。也许我可以检查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\Version的> = 4.5.51641,但根据MSDN,这是推荐的方法,如果他们发布,例如4.6,那就会发生什么向后兼容?

2 个答案:

答案 0 :(得分:1)

To find .NET Framework versions by querying the registry in code (.NET Framework 4.5 and later)州:

  

检查Release关键字的值以确定已安装的版本。要向前兼容,您可以检查大于或等于表中列出的值的值。

这只是略低于原始问题中MSDN链接所指向的位置(感谢您让我离开)。

在我的.wxs文件中,我的代码似乎正常工作,在过低的.Net 4.5版本上失败并显示有效消息。

在< Product>中放置以下属性引用和条件:

<!-- Must have at least .Net 4.5.2 which has release 379893 -->
<PropertyRef Id="NETFRAMEWORK45RELEASE"/>
<Condition Message="$(var.ProductName) requires .NET Framwork 4.5.2. Please install the .NET Framwork then run this installer again.">
    Installed OR ( NETFRAMEWORK45RELEASE AND NETFRAMEWORK45RELEASE >= "#379893" )
</Condition>

在其他地方声明了以下片段:

<Fragment>
    <Property Id="NETFRAMEWORK45RELEASE">
        <RegistrySearch Id="NetFramework452Release"
                        Root="HKLM"
                        Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full"
                        Name="Release"
                        Type="raw" />
    </Property>
</Fragment>

答案 1 :(得分:-2)

我不确定为什么你会担心未来的版本不能向后兼容,他们都到目前为止还没有理由相信这会改变。您今天正在创建安装程序,而不是每当4.6发布时,所以即使您能够检测到它,您究竟会做什么?拒绝安装,但最有可能兼容?除了确保安装.net版本[至少是你的目标]之外,没有什么可以检测的。

此外,如果您真的担心未来的主要版本会破坏兼容性,那么您可以将安装程序嵌入到您定位的.net版本中,如果发生这种情况,则应该将您的应用程序安装在Windows 9 / .net上6以后和那些碰巧没有到位升级,安装程序将并排安装以前的版本,当并排安装多个.net版本时,将使用与您的应用程序匹配的版本。