12

我需要在我的安装包中包含 Microsoft .NET 4.5 作为先决条件,并且我希望它尽可能自动化。但是,卸载时不应删除.NET 。我想我已经阅读了有关如何使用DetectCondition和/或的所有内容InstallCondition,但我仍然没有正确理解;它要么总是运行 .NET 安装,要么从不运行它。

这是我的最新设置:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
     xmlns:netfx='http://schemas.microsoft.com/wix/NetFxExtension'>

  <!-- Define minimum .NET Framework version -->
  <?define NetFx45MinRelease = 377811?>
  ...
    <Chain>
      <PackageGroupRef Id="Netfx45FullPackage"/>
      ...
    </Chain>

    <PackageGroup Id="Netfx45FullPackage">
      <ExePackage Id="Netfx45Full" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes"
                  SourceFile="..\..\..\..\Environment\InstallerResources\Prerequisites\dotnetfx45_full_x86_x64.exe"
                  InstallCommand="/passive /norestart"
                  DetectCondition="NETFRAMEWORK45 &gt;= $(var.NetFx45MinRelease)"
                  InstallCondition="NOT REMOVE AND (NETFRAMEWORK45 &lt; $(var.NetFx45MinRelease))" />
    </PackageGroup>

(出于某种原因,我必须定义NetFx45MinRelease自己,即使它应该包含在 WixNetFxExtension 中。)

我怎样才能得到正确的设置?

4

2 回答 2

11

我不太清楚你为什么会遇到问题,但我只是有同样的任务,它(现在;-)按预期工作。也就是说,它仅在需要时安装.NET 4.5,并且在整个卸载引导程序时不会执行 .NET 卸载。

但是,.NET 4.5可以单独卸载,我认为这很好。

这是我使用的(很可能来自其他 Stack Overflow 帖子):

<PackageGroup Id="Netfx45Xxx">
    <ExePackage Id="Netfx45Xxx" Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="yes" InstallCommand="/q"
        SourceFile="C:\wixtest\dotnetfx45_full_x86_x64.exe"
        DetectCondition="(Netfx4FullVersion=&quot;4.5.50709&quot;) AND (NOT VersionNT64 OR (Netfx4x64FullVersion=&quot;4.5.50709&quot;))"
        InstallCondition="(VersionNT >= v6.0 OR VersionNT64 >= v6.0) AND (NOT (Netfx4FullVersion=&quot;4.5.50709&quot; OR Netfx4x64FullVersion=&quot;4.5.50709&quot;))"/>
</PackageGroup>

奇怪的是,您已经拥有 Permanent="yes",这确实是保持 .NET 处于卸载状态的关键。

一个区别是我在 InstallCondition 中没有明确的“NOT REMOVE”,也许这比对 Windows Installer 的帮助更令人困惑...?

我正在使用当前最新的 WiX 3.7.1224.0。


TheESJ 的回答有一条评论:即使使用预定义的 PackageGroupRef,您也可以提供本地文件以避免下载。只需将它放在您的引导程序 EXE 文件下方的“redist”文件夹中,如果存在而不下载,它将从那里获取。我昨天在安装错误后通过日志文件发现了这种行为。

于 2013-01-15T15:43:20.463 回答
5

您不需要定义 PackageGroup。这包含在 WixNetFxExtension 中。请参阅http://wix.sourceforge.net/manual-wix3/install_dotnet.htm。您需要做的就是在您的 wixproj 中包含对 WixNetFxExtension 的引用,然后将 PackageGroupRef 添加到此处记录的 PackageGroup 之一:http ://wix.sourceforge.net/manual-wix3/wixnetfxextension.htm到您的链中。

于 2012-11-26T18:14:02.247 回答