使用WiX检测.NET Framework 4.5.1

使用WiX检测.NET Framework 4.5.1,.net,windows,wix,installation,.net,Windows,Wix,Installation,我正在使用WIX3.8在我的解决方案中创建一个安装程序项目。作为此次安装的一部分,我创建了一些启动条件,其中之一是检查是否安装了Microsoft.NET Framework 4.5.1 要做到这一点,我想使用WixNetFxExtension库中的一些属性,这些属性对于较旧版本的.NET framework似乎可以正常工作。有一个示例说明了如何在.NET 4.5.1不适用的情况下执行此操作,因为没有要检查的NETFRAMEWORK451属性 查看NetFx451.wxs模块()的源代码,似乎没

我正在使用WIX3.8在我的解决方案中创建一个安装程序项目。作为此次安装的一部分,我创建了一些启动条件,其中之一是检查是否安装了Microsoft.NET Framework 4.5.1

要做到这一点,我想使用WixNetFxExtension库中的一些属性,这些属性对于较旧版本的.NET framework似乎可以正常工作。有一个示例说明了如何在.NET 4.5.1不适用的情况下执行此操作,因为没有要检查的NETFRAMEWORK451属性

查看NetFx451.wxs模块()的源代码,似乎没有单独的属性可用于.NET 4.5.1,但它也使用相同的NETFRAMEWORK45。据我所知,v4.5.1是v4.5的就地升级,因此它使用相同的注册表项(我认为)。无论如何,在该模块中,他们只需检查NETFRAMEWORK45返回的版本号,如下所示:

DetectCondition="NETFRAMEWORK45 >= $(var.NetFx451MinRelease)"
所以我假设我可以写一个如下的条件:

    <PropertyRef Id="NETFRAMEWORK45" />
    <Condition Message="The .NET Framework 4.5.1 was not found.  Stopping installation.">
       <![CDATA[Installed OR (NETFRAMEWORK45 >= 378675)]]>
    </Condition>

= 378675)]]>
但是,这在我知道安装了.NET Framework 4.5.1的机器上返回了错误消息。所以我创建了这样一个条件,这样我就可以看到从注册表返回的版本号:

    <PropertyRef Id="NETFRAMEWORK45" />
    <Condition Message ="[NETFRAMEWORK45]">0</Condition>

0
这显示了一个带有以下文本的消息框:#378758,因此我知道注册表中的值是正确的

所以我有点困惑,为什么我的条件失败了。这里是否有明显的遗漏,或者是否有其他方法来比较condition元素中的值

以下是包含PhilDW建议的哈希符号的修复程序:

    <PropertyRef Id="NETFRAMEWORK45" />
    <Condition Message="The .NET Framework 4.5.1 was not found.  Stopping installation.">
      <![CDATA[Installed OR (NETFRAMEWORK45 >= "#378675")]]>
    </Condition>

= "#378675")]]>
你把它包括在内#在比较中,这是没有用的。您是否尝试过在CDATA比较中包含#

我假设,当Microsoft人员发布代码示例以检测框架版本时,不能在MSI文件中使用简单的RegistrySearch


我同意“#”符号可能是导致您的比较出现问题的原因,但让我感到奇怪的是,NETFRAMEWORK45的值中包含了这个符号。就像他们不想让你做这种比较一样…按照PhilDW的建议编辑以显示修复。还要注意,我必须在值的周围加上引号。感谢Phil的帮助。值得注意的是,上面的比较是比较字符串,因此#900将高于#378675。我敢说,.NET4.5的point版本不会导致注册表中的release属性时钟切换到1000000,这是一个公平的赌注。值得一提的是,我假设除了基本版本号之外的任何其他版本号都是更高的版本,因此也是我们想要的。因此,我的比较是:“#378389”)]>最新版本的WiX有一个属性:WiX_是_NETFRAMEWORK_451_或_LATER_安装在此处所述:。我构建了一个MSI,它使用这个属性来查看WiX如何设置它,并且它完全使用了上面描述的修复程序。