根据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时,同一个密钥不再是378675
或378758
,而是现在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,那就会发生什么不向后兼容?
答案 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版本时,将使用与您的应用程序匹配的版本。