使用WIX安装程序安装.NET Framework 4.7.2(如果需要)

18

求助! 我继承了一个带有WIX安装程序项目的.NET项目。他们隐含地假设每台计算机上都安装了.NET Framework 4.5,这在大多数情况下是正确的。现在我们正在添加一些需要.NET Framework 4.7.2的功能。我想修改安装设置以检查4.7.2(或更高版本)的存在,并在必要时通过Web进行安装。我找到了一些部分回答我的问题的文档,但我仍然非常困惑如何入手并填写具体细节。是否有可用的完整演示或说明? 我的理解是我需要添加一个“BootStrapper”项目。如果我从我的主要安装(我的现有安装)中添加/引用BootStrapper项目,还是如果我将主要安装作为Bootstrapper项目的一部分引用(通过MsiPackage元素),我就会感到困惑。另外,我如何设置检查4.7.2的事项?所有我找到的参考资料都是针对4.5或更早期的,而且显然用于检查的注册表位置已更改:

如何检测已安装的.NET Framework版本和服务包?

假设我在Bootstrapper中引用我的主要安装,我该怎么做?

以下是我找到的链接(如有兴趣)。它们都暗示了答案,但没有给出完整的答案和/或已过时。

http://wixtoolset.org/documentation/manual/v3/howtos/redistributables_and_install_checks/install_dotnet.html

https://www.firegiant.com/wix/tutorial/net-and-net/bootstrapping/

https://wix.ronifuchs.com/

最后,我相信我正在使用WIX Toolset v3.11。这就是文件夹指示的内容(C:\Program Files (x86)\WiX Toolset v3.11)。

我提到这个是因为一些参考资料提到了Wix 4.0(例如:http://wixtoolset.org/releases/" />)

谢谢!

2个回答

12

我发现这个问题有一点误导,因为问题是关于4.7.2版本的,但是被接受的答案是关于4.7.1版本的。

所有确切的细节都在这里

在没有安装4.7.2的计算机上进行测试,一切都完美地工作了——安装程序下载并安装了.NET Framework组件,然后才继续进行程序安装本身。


最终,我将我的代码重新定向到.NET 4.7.1,并使用原始答案。但这对将来非常有用,所以+1和谢谢:) - Tim Long
1
未来已经到来,我现在在另一个项目中使用它,所以再次感谢您。不幸的是,我只能给你点赞一次;-) - Tim Long
1
如果您需要v4.8的相同内容,请转到此处:https://github.com/wixtoolset/issues/issues/5977。简单的复制和粘贴将不起作用,请记得向下滚动并更新最新的RemotePayload部分 - 否则您会像我今天一样浪费时间 :)也许Microsoft将再次更新他们的安装程序 - 最好双重检查证书公钥,版本和尺寸与此处发布的安装程序:https://dotnet.microsoft.com/download/dotnet-framework 相匹配 - Jan Zeman

12

去年在这里开了一个工单,并提供了一种解决方法:

  <?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

  <!--
        .NET Framework installation state properties

        Official documentation can be found at the following location:

           .NET Framework 4.5/4.5.1/4.5.2/4.6/4.6.1/4.6.2/4.7/4.7.1 - http://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx
    -->

  <?define NetFx471MinRelease = 461308 ?>
  <?define NetFx471WebLink = http://go.microsoft.com/fwlink/?LinkId=852092 ?>
  <?define NetFx471RedistLink = http://go.microsoft.com/fwlink/?LinkId=852104 ?>
  <?define NetFx471EulaLink = http://referencesource.microsoft.com/license.html ?>

  <Fragment>
    <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
    <Property Id="WIX_IS_NETFRAMEWORK_471_OR_LATER_INSTALLED" Secure="yes" />
    <SetProperty Id="WIX_IS_NETFRAMEWORK_471_OR_LATER_INSTALLED" Value="1" After="AppSearch">
      WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx471MinRelease)"
    </SetProperty>
  </Fragment>

  <Fragment>
    <util:RegistrySearchRef Id="NETFRAMEWORK45"/>

    <WixVariable Id="WixMbaPrereqPackageId" Value="NetFx471Web" />
    <WixVariable Id="WixMbaPrereqLicenseUrl" Value="$(var.NetFx471EulaLink)" Overridable="yes" />
    <WixVariable Id="NetFx471WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx471MinRelease)" Overridable="yes" />
    <WixVariable Id="NetFx471WebInstallCondition" Value="" Overridable="yes" />
    <WixVariable Id="NetFx471WebPackageDirectory" Value="redist\" Overridable="yes" />

    <PackageGroup Id="NetFx471Web">
      <ExePackage
          InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx471FullLog].html&quot;"
          RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx471FullLog].html&quot;"
          UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx471FullLog].html&quot;"
          PerMachine="yes"
          DetectCondition="!(wix.NetFx471WebDetectCondition)"
          InstallCondition="!(wix.NetFx471WebInstallCondition)"
          Id="NetFx471Web"
          Vital="yes"
          Permanent="yes"
          Protocol="netfx4"
          DownloadUrl="$(var.NetFx471WebLink)"
          LogPathVariable="NetFx471FullLog"
          Compressed="no"
          Name="!(wix.NetFx471WebPackageDirectory)NDP471-KB4033344-Web.exe">
        <RemotePayload
          CertificatePublicKey="2ECAEC21B884B40A7C5FB141D2CBC4CDA4930752"
          CertificateThumbprint="49D59D86505D82942A076388693F4FB7B21254EE"
          Description="Microsoft .NET Framework 4.7.1 Setup"
          Hash="C0919415622D86C3D6AB19F0F92EA938788DB847"
          ProductName="Microsoft .NET Framework 4.7.1"
          Size="1434504"
          Version="4.7.2558.0" />
      </ExePackage>
    </PackageGroup>
  </Fragment>

  <Fragment>
    <util:RegistrySearchRef Id="NETFRAMEWORK45"/>

    <WixVariable Id="WixMbaPrereqPackageId" Value="NetFx471Redist" />
    <WixVariable Id="WixMbaPrereqLicenseUrl" Value="$(var.NetFx471EulaLink)" Overridable="yes" />
    <WixVariable Id="NetFx471RedistDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx471MinRelease)" Overridable="yes" />
    <WixVariable Id="NetFx471RedistInstallCondition" Value="" Overridable="yes" />
    <WixVariable Id="NetFx471RedistPackageDirectory" Value="redist\" Overridable="yes" />

    <PackageGroup Id="NetFx471Redist">
      <ExePackage
          InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx471FullLog].html&quot;"
          RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx471FullLog].html&quot;"
          UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx471FullLog].html&quot;"
          PerMachine="yes"
          DetectCondition="!(wix.NetFx471RedistDetectCondition)"
          InstallCondition="!(wix.NetFx471RedistInstallCondition)"
          Id="NetFx471Redist"
          Vital="yes"
          Permanent="yes"
          Protocol="netfx4"
          DownloadUrl="$(var.NetFx471RedistLink)"
          LogPathVariable="NetFx471FullLog"
          Compressed="no"
          Name="!(wix.NetFx471RedistPackageDirectory)NDP471-KB4033342-x86-x64-AllOS-ENU.exe">
        <RemotePayload
          CertificatePublicKey="2ECAEC21B884B40A7C5FB141D2CBC4CDA4930752"
          CertificateThumbprint="49D59D86505D82942A076388693F4FB7B21254EE"
          Description="Microsoft .NET Framework 4.7.1 Setup"
          Hash="5F0597CEADDBDF3BAD24CA6EBE142BD81C2DF713"
          ProductName="Microsoft .NET Framework 4.7.1"
          Size="68742112"
          Version="4.7.2558.0" />
      </ExePackage>
    </PackageGroup>
  </Fragment>
</Wix>

然后在bundle.wxs中,您需要添加以下内容:

  <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

  <Bundle Name="..."
          Version="..." 
          Manufacturer="..." 
          UpgradeCode="..." 
          >

    <Chain>      

      <!--Install .Net Framework 4.7.1-->
      <PackageGroupRef Id="NetFx471Redist"/>

      <!--Install Product-->
      <MsiPackage
        Id="Setup"   
        DisplayInternalUI="yes"
        Compressed="yes"
        SourceFile="..."
        Vital="yes">        
      </MsiPackage>     

    </Chain>
  </Bundle>  
</Wix>

1
你能详细说明一下吗?NetFxExtension是什么?你的顶部代码片段也放在引导程序项目中吗?还是放在主安装程序包中?谢谢! - Dave
WixNetfxExtension包含软件包组,使将.NET包含在您的捆绑包中变得更容易。它还可以帮助您检测各种版本的.NET Frameworks、.NET SDK或Windows SDK的存在。您可以在此处查阅更多信息:http://wixtoolset.org/documentation/manual/v3/howtos/redistributables_and_install_checks/check_for_dotnet.html。 顶部代码应放入启动器项目中。 - Andrei Petrut
谢谢Andrei。你的回答和链接解决了我的问题,非常有帮助。我还卡在后面的阶段,但会发布一个单独的问题。谢谢! - Dave
如果您有时间,请查看我的最新问题:https://stackoverflow.com/questions/53744486/require-wix-bootstrapper-to-reboot-after-net-framework-installation-and-skip-ap - Dave
有人知道.NET 4.7.2是否已经完成了吗?我猜解决方案可能是类似的,但有一些GUID和哈希值,我宁愿不去猜测。 - Tim Long
1
嗨@TimLong,看一下我单独发布的答案。所有位、细节、GUID和哈希都可以在GitHub上找到。我在我的应用程序上进行了测试,完美地工作。 - Jan Zeman

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