WiX检测.Net 4.0.3

时间:2013-09-23 17:10:50

标签: wix wix3.7

我的应用程序需要.Net 4.0.3(link)。

我发现this article告诉我在哪里可以找到安装的.Net版本,但我能找到的是WiX编译器识别的包含属性列表(here

我已尝试按照this article中的说明操作,它告诉我使用以下代码,但这只是在没有更新的情况下安装.Net 4:

<PropertyRef Id="NETFRAMEWORK40FULL"/>

<Condition Message="This application requires .NET Framework 4.0.3. Please install the .NET Framework then run this installer again.">
    <![CDATA[Installed OR NETFRAMEWORK40FULL]]>
</Condition>

如何通过预定义的WiX属性或自行检查注册表值,如何对特定的4.0.3更新进行WiX检查?

2 个答案:

答案 0 :(得分:4)

经过一些阅读后,我最终在我的解决方案中添加了一个捆绑项目,该项目引用了标准WiX安装程序项目(Product)中的主MyProject.Installer。然后我使用RegistrySearch来查找完整.Net 4安装的版本。

<Bundle ....>
    <Chain>
        <PackageGroupRef Id="Netfx4Full" />
        <PackageGroupRef Id="Netfx403Update" />
        <MsiPackage Id="MyMsi" SourceFile="$(var.MyProject.Installer.TargetPath)" Compressed="yes" DisplayInternalUI="yes" />
    </Chain>
</Bundle>
<Fragment>
    <util:RegistrySearch Root="HKLM"
                     Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
                     Value="Version"
                     Variable="Netfx4FullVersion" />
    <util:RegistrySearch Root="HKLM"
                     Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
                     Value="Version"
                     Variable="Netfx4x64FullVersion"
                     Win64="yes" />
    <PackageGroup Id="Netfx4Full">
        <ExePackage Id="Netfx4Full"
              Cache="no"
              Compressed="yes"
              PerMachine="yes"
              Permanent="yes"
              Vital="yes"
              SourceFile="$(var.ProjectDir)dotNetFx40_Full_x86_x64.exe"
              DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"
              DetectCondition="Netfx4FullVersion AND (NOT VersionNT64 OR Netfx4x64FullVersion)" />
    </PackageGroup>

    <PackageGroup Id="Netfx403Update">
        <ExePackage Id="Netfx403Update"
              Cache="no"
              Compressed="yes"
              PerMachine="yes"
              Permanent="yes"
              Vital="yes"
              SourceFile="$(var.ProjectDir)NDP40-KB2600211-x86-x64.exe" 
              DetectCondition="Netfx4FullVersion AND (Netfx4FullVersion &lt;&lt; &quot;4.0.3&quot; OR Netfx4FullVersion &lt;&lt; &quot;4.5&quot;)" />
    </PackageGroup>
</Fragment>

在没有XML转义的情况下,条件扩展到Netfx4FullVersion AND (Netfx4FullVersion << "4.0.3" OR Netfx4FullVersion << "4.5")

以下文章很有帮助:

Bundle skeleton code

Bundle package manifest

Defining searches using WiX variables

Chaining packages into a bundle

How to check for .Net versions

答案 1 :(得分:3)

注册表项"SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"中的版本值对于.net 4.0始终为4.0.30319(即使已安装更新)。

以下是我在我的捆绑包中使用的代码,用于搜索是否已安装.net 4.0.3版本:

<util:RegistrySearch Root="HKLM" 
    Key="SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.3"
    Result="exists" 
    Variable="Netfx403" />
<util:RegistrySearch Root="HKLM"  
    Key="SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.3" 
    Result="exists"
    Variable="Netfx403x64"
    Win64="yes" />

然后在你的ExePackage DetectCondition中:

DetectCondition="Netfx403 AND (NOT VersionNT64 OR Netfx403x64)"