Install .NET Framework 4.7.2 (if needed) with WIX installer
Asked Answered
R

2

18

Help! I've inherited a .NET project with a WIX installer project. They make the implicit assumption that .NET Framework 4.5 is installed on each machine which for the most part is true. Now we are adding some features that require .NET Framework 4.7.2 . I'd like to modify the install set to check for the presence of 4.7.2 (or higher) and install via web if necessary. I've found some documentation that's partially answered my questions but I'm still very confused how to get started and how to fill in the specifics. Are there any complete demos or instructions available? My understanding is that I need to add a "BootStrapper" project. I'm confused if I then add/reference the BootStrapper project from my main install (my existing install) OR if I reference the main install as part of the Bootstrapper project (via MsiPackage element). Also, how do I set things up to check for 4.7.2? All the references I found were for 4.5 or earlier and apparently the place in the registry for checking has changed:

How do I detect what .NET Framework versions and service packs are installed?

Assuming I refer to my main install in the Bootstrapper, how do I do this?

These are the links I've found for those interested. They all hint at the answers, but don't give complete answers and/or are out of date.

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/

Finally, I believe I am using WIX Toolset v3.11. This is what the folder indicates (C:\Program Files (x86)\WiX Toolset v3.11)

I mention this because some of the reference material refers to Wix 4.0 (Example: http://wixtoolset.org/releases/" />)

Thanks!

Refugia answered 5/12, 2018 at 20:30 Comment(0)
A
12

A ticket was opened here last year and a workaround has been provided:

  <?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>

and then in bundle.wxs you need to add this:

  <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>
Apophyge answered 7/12, 2018 at 11:51 Comment(6)
Can you elaborate? What is NetFxExtension Does your top code snippet also go in the bootstrapper project? Or in the main installer package? Thanks!Refugia
WixNetfxExtension includes package groups that make it easier to include .NET in your bundles. It can also help you detect the presence of various versions of .NET Frameworks, .NET SDK or Windows SDK. You can consult more info here The top code should go into the bootstrapper project.Apophyge
Thanks Andrei. Your answer and link answered my immediate question and was very helpful. I'm still stuck on a later stage, but will post a separate question. Thanks!Refugia
Please look at my latest question if you get a chance: #53744986Refugia
Does anyone know if this has been done for .NET 4.7.2? I guess the solution would be similar but there are some GUIDs and hashes that I'd rather not attempt to guess.Standridge
Hi @TimLong, have a look on the answer I posted separately. All the bits, details, GUIDs and hashes can be found on GitHub. I tested on my app and worked perfectly.Sebastian
S
12

I found it bit misleading that the question is about 4.7.2 but the accepted answer about 4.7.1 version.

All the exact bits are here.

Just tested on a computer without 4.7.2 installed and all worked perfectly - the installer downloaded and installed .NET Framework component and first then it continued with the program installation itself.

Sebastian answered 19/2, 2019 at 23:45 Comment(3)
In the end I re-targeted my code down to .NET 4.7.1 and used the original answer as-is. But this is really useful for the future so +1 and thanks :)Standridge
The future has arrived, and I'm now using this in a different project, so double thanks. Unfortunately I can only up-vote you once ;-)Standridge
In case you need the same for v4.8 go here github.com/wixtoolset/issues/issues/5977. Simple copy&paste will not work, remember to scroll down and update the latest RemotePayload sections - otherwise you waste your time as I did today :) Maybe Microsoft will update their installers again - better double check the CertificatePublicKey, Version and Size against the installers posted here: dotnet.microsoft.com/download/dotnet-frameworkSebastian

© 2022 - 2024 — McMap. All rights reserved.