如何通过WiX捆绑包安装.NET 4.5?

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>
< p>出于某种原因,尽管应该包含在WixNetFxExtension中,但我不得不自己定义 NetFx45MinRelease

我该如何正确设置?


#define指令是按文件的方式处理的。因此,您应该在使用它的每个文件中包含它。这就是为什么您被迫重新声明它的原因。 - Sasha
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”文件夹中,如果存在,则会从那里获取而不会下载。昨天在错误的安装后通过日志文件发现了这种行为。


谢谢!我实际上使用了类似的(现在工作正常 :))设置,我想我会调整我的“InstallCondition”来使用你的设置。 - Torbjörn Bergstedt
10
<PackageGroup>的上下文是什么?它在哪个文件中?它包含在<Bundle>标记中还是其他地方?WiX文档对此的描述较差,这个答案并没有完整呈现整个情况。 - Stealth Rabbi
2
很希望能看到这个如何完整地运作的示例。 - C.J.

5

我知道那个选项,我们这样做的原因是为了完全控制安装内容,并允许在没有互联网访问的机器上进行安装。 - Torbjörn Bergstedt
8
展示如何做总比告诉怎么做更好……我们中有些人对Wix非常陌生(只有几个小时的使用经验)。 - C.J.
同时,fx包不适用于burn引导程序,对于msi非常好,但对于exe则不太适用。 - Paul Swetz
这是一个老问题,但我很好奇,因为我正在尝试尽可能简单地安装 .net 依赖项。所以你的意思是 <PackageGroupRef Id="NetFx461Web" /> 不能与启动程序一起使用?@PaulSwetz - Todilo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接