Wix: getting WixUI_minimal to show when bootstrapper is used - wix

I'm somewhat new to Wix. I created a bootstrapper to check and install .NET version 4 framework if it doesn't exist. In my msi package, I'm using WixUI_minimal installer interface. When I run the bootstrapper.exe, the standard bootstrapper UI shows instead of the WixUI_minimal. Is there a way to have WixUI_minimal present and have .NET framework install in the background without showing the bootstrapper UI? What options do I have here? Any tips would be appreciated. Thanks.
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Bundle Name="BootstrapperRedist" Version="1.0.0.0" Manufacturer="Testment Technologies" UpgradeCode="3f40cdd1-640d-4fe6-8edb-17a308d8f227">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Chain>
<PackageGroupRef Id="NetFx40ClientRedist"/>
<MsiPackage Id="MyApplication" SourceFile="$(var.MicroSynSetupProject.TargetPath)"/>
</Chain>
</Bundle>
<Fragment>
<!-- Check for .NET 4.0 -->
<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"
DisplayName="Microsoft .NET Framework 4.0"
DownloadUrl="http://download.microsoft.com/download/5/6/2/562A10F9-C9F4-4313-A044-9C94E0A8FAC8/dotNetFx40_Client_x86_x64.exe"
Compressed="no"
Cache="yes"
PerMachine="yes"
Permanent="yes"
Protocol="netfx4"
Vital="yes"
SourceFile=".\dotNetFx40_Full_x86_x64.exe"
InstallCommand="/passive /norestart"
DetectCondition="Netfx4FullVersion AND (NOT VersionNT64 OR Netfx4x64FullVersion)" />
</PackageGroup>
</Fragment>
</Wix>
I decided to change the bootstrapper application UI to include my license, a logo and a theme. This was done by including the WixBalExtension as a reference. This seems like the simplest way to go for the moment in having one unified install UI. The new bootstrapper listing is below.
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--Version="1.0.0.0"-->
<Bundle Name="BootstrapperRedist"
Version="!(bind.packageVersion.MicroSyn)"
UpgradeCode="3f40cdd1-640d-4fe6-8edb-17a308d8f227"
IconSourceFile=".\MS.ico">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
<bal:WixStandardBootstrapperApplication
LicenseFile=".\license.rtf"
ThemeFile=".\RtfTheme.xml"
LogoFile=".\MS_64x64.bmp"/>
</BootstrapperApplicationRef>
<Chain>
<PackageGroupRef Id="NetFx40ClientRedist"/>
<MsiPackage Id="MicroSyn"
SourceFile="$(var.MicroSynSetupProject.TargetPath)"
DisplayInternalUI="no"/>
</Chain>
</Bundle>
<Fragment>
<!-- Check for .NET 4.0 -->
<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"
DisplayName="Microsoft .NET Framework 4.0"
DownloadUrl="http://download.microsoft.com/download/5/6/2/562A10F9-C9F4-4313-A044-9C94E0A8FAC8/dotNetFx40_Client_x86_x64.exe"
Compressed="no"
Cache="yes"
PerMachine="yes"
Permanent="yes"
Vital="yes"
SourceFile=".\dotNetFx40_Full_x86_x64.exe"
InstallCommand="/passive /norestart"
DetectCondition="Netfx4FullVersion AND (NOT VersionNT64 OR Netfx4x64FullVersion)"/>
</PackageGroup>
</Fragment>
</Wix>

On your MSI package you would need to set the attribute DisplaysInternalUI to Yes.
From the documentation:
Specifies whether the bundle will show the UI authored into the msi
package. The default is "no" which means all information is routed to
the bootstrapper application to provide a unified installation
experience. If "yes" is specified the UI authored into the msi package
will be displayed on top of any bootstrapper application UI.
http://wixtoolset.org/documentation/manual/v3/xsd/wix/msipackage.html

Related

WiX bundle creates multiple entries in the ARP for the same version

I've created a WiX bundle that simply installs a VC redist and than an MSI.
Looks as follows:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Bundle Name="Thrust" Version="1.1.0.0" Manufacturer="Maker" UpgradeCode="e356a490-31a8-4c0b-9aeb-82cbf3350082">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Chain>
<!-- Install Required VCRedist -->
<PackageGroupRef Id="VCRedist"/>
<!-- Install Thrust Msi -->
<MsiPackage Id="ThrustInstaller"
Cache="yes" Compressed="yes" Visible="yes"
DisplayInternalUI="no"
SourceFile="..\ThrustInstaller\bin\Release\ThrustInstaller.msi">
</MsiPackage>
</Chain>
</Bundle>
<Fragment>
<util:RegistrySearch
Variable="IsVCInstalled"
Root="HKLM"
Key="SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\X64"
Value="Installed"
Win64="yes"
/>
<util:RegistrySearch
Variable="VCVersionMajor"
Root="HKLM"
Key="SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\X64"
Value="Major"
Win64="yes"
/>
<util:RegistrySearch
Variable="VCVersionMinor"
Root="HKLM"
Key="SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\X64"
Value="Minor"
Win64="yes"
/>
<util:RegistrySearch
Variable="VCVersionBld"
Root="HKLM"
Key="SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\X64"
Value="Bld"
Win64="yes"
/>
<WixVariable Id="WixMbaPrereqLicenseUrl" Value="" />
<WixVariable Id="WixMbaPrereqPackageId" Value="VCRedist" />
<PackageGroup Id="VCRedist">
<ExePackage Id="VCRedist"
SourceFile="..\..\external\VC_redist.x64.exe"
InstallCommand="/q /norestart"
Cache="no"
PerMachine="yes"
Permanent="yes"
Vital="yes"
Compressed="yes"
DetectCondition="IsVCInstalled AND VCVersionMajor >= 14 AND VCVersionMinor >= 27 AND VCVersionBld >= 29016"
InstallCondition="1"/>
</PackageGroup>
</Fragment>
</Wix>
The VC redist installation works as expected.
However, when installing a bundle with the same version but different internal version of the MSI, I can see that the MSI is being installed, but I'm getting duplicated entries for the bundle in the ARP(only 1 entry for the MSI as expected).
In the MSI I'm allowing same version upgrades:
<MajorUpgrade AllowDowngrades="no" AllowSameVersionUpgrades="yes" Schedule="afterInstallInitialize" DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
I'm guessing that the reason for the two entries in the ARP is that the bundle doesn't allow same version upgrades?
I'm not satisfied with the answer in how-to-do-major-upgrades-when-using-burn-wix-3-6, It suggests to upgrade the bundle version. Can't I achieve a behavior s.t if the MSI version is different from the one installed, but the bundle version is the same, it will not cause duplicated ARP entries?
Thanks.

Force install fail with message using WiX Bundle MBA

I'm taking over this project and don't have access to the person who set it up initially. Currently the bundle has .net4 included. The desire is to remove the file and make the end user download .net manually. I'm trying to set the bundle up to check the installed .net version (if any), display a details message with a download link if it doesn't meet the reqs then abort the install and close.
Every time I try to remove the variables that point to the .net package I get build errors. This is what I have so far.
<Chain>
<PackageGroupRef Id='Netfx4Full' />
<MsiPackage SourceFile="$(var.TargetDir)Client.msi" Id="Client" Cache="no" Visible="no" ForcePerMachine="yes">
<MsiProperty Name="INSTALLDIR" Value="[InstallFolder]"/>
</MsiPackage>
</Chain>
</Bundle>
<Fragment>
<PropertyRef Id="NETFRAMEWORK40FULL"/>
<Variable Name="InstallationPath" bal:Overridable="yes" />
<WixVariable Id="WixMbaPrereqPackageId" Value="Netfx4Full" />
<WixVariable Id="WixMbaPrereqLicenseUrl" Value="NetfxLicense.rtf" />
<Variable Name="DisplayVersion" Value="$(var.BundleVersion)" />
<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" />
<Condition Message="This application requires .NET Framework 4.0. Please install the .NET Framework then run this installer again.">
<![CDATA[Installed OR NETFRAMEWORK40]]>
</Condition>
<PackageGroup Id="Netfx4Full">
<ExePackage Id="Netfx4Full" Cache="no" PerMachine="yes" Permanent="yes" Vital="yes" Compressed="no"
SourceFile="DotNetInstallers/dotnetfx40_full_x86_x64.exe"
DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"
DetectCondition="Netfx4FullVersion OR Netfx4x64FullVersion">
</ExePackage>
</PackageGroup>
</Fragment>
Any help would be appreciated.
Based on these lines, it looks like you're using the ManagedBootstrapperApplicationHost.
<WixVariable Id="WixMbaPrereqPackageId" Value="Netfx4Full" />
<WixVariable Id="WixMbaPrereqLicenseUrl" Value="NetfxLicense.rtf" />
The ManagedBootstrapperApplicationHost is the builtin way in WiX to use a custom BootstrapperApplication built in .NET (a managed BA, or MBA). The MBAHost requires you to package .NET in your bundle. If you're concerned about the size of your bundle, then you can use the NetFx4Web package in the WixNetFxExtension. This will make the bundle download the web installer at runtime. You can customize the user interface that appears while installing .NET using mbapreq.thm and mbapreq.wxl.

WiX detect .Net 4.0.3

I have an application that requires .Net 4.0.3 (link).
I've found this article which tells me where I would find the version of .Net which is installed but all I can find is the list of included properties that the WiX compiler recognises (here).
I've tried following the directions in this article, which tells me to use the following code, but this just installs .Net 4 without the update:
<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>
How would I go about making WiX check for the specific 4.0.3 update, either through a pre-defined WiX property or checking the registry value myself?
After some reading, I ended up adding a bundle project to my solution that references my main Product in the standard WiX installer project (MyProject.Installer). I then used a RegistrySearch to find the version of the full .Net 4 installation.
<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 << "4.0.3" OR Netfx4FullVersion << "4.5")" />
</PackageGroup>
</Fragment>
The condition expands out to Netfx4FullVersion AND (Netfx4FullVersion << "4.0.3" OR Netfx4FullVersion << "4.5") without XML escaping.
The following articles were helpful:
Bundle skeleton code
Bundle package manifest
Defining searches using WiX variables
Chaining packages into a bundle
How to check for .Net versions
Version value within the registry key "SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" will be always 4.0.30319 for .net 4.0 (even if updates have been installed).
Here is the code I have used in my bundle to search if the .net 4.0.3 version was already installed:
<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" />
Then in your ExePackage DetectCondition:
DetectCondition="Netfx403 AND (NOT VersionNT64 OR Netfx403x64)"

WiX Bootstrapper doesn't start/work

Ive a problemm with my wix bootstrapper to install .Net 4 and my application(.msi generated with wix 3.7). When i compile my solution everything is ok, and the generated exe has the right size(not sure if important, when i use winrar to open the exe there are just a few files in it, and not the files i want to install).
When i double click my exe nothing happens(with and without administrator).
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Bundle Name="Bootstrapper" Version="1.0.0.0" Manufacturer="asdf"
UpgradeCode="{D188D758-2913-4BA8-B9BA-FEC5B4BCCBD7}">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Chain>
<!-- TODO: Define the list of chained packages. -->
<PackageGroupRef Id="Netfx4Full"/>
<MsiPackage Id="Myapp" SourceFile="$(var.Myapp.TargetPath)"/>
</Chain>
</Bundle>
<Fragment>
<!-- Check for .NET 4.0 -->
<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"
DisplayName="Microsoft .NET Framework 4.0"
DownloadUrl="http://download.microsoft.com/download/5/6/2/562A10F9-C9F4-4313-A044-9C94E0A8FAC8/dotNetFx40_Client_x86_x64.exe"
Compressed="no"
Cache="yes"
PerMachine="yes"
Permanent="yes"
Protocol="netfx4"
Vital="yes"
SourceFile=".\dotNetFx40_Full_x86_x64.exe"
InstallCommand="/passive /norestart"
DetectCondition="Netfx4FullVersion AND (NOT VersionNT64 OR Netfx4x64FullVersion)" />
</PackageGroup>
</Fragment>
</Wix>
Myapp.msi is imported as reference in the bootstrapper projekt.
May someone can help me where ive to look(iam not sure if im able to create a logfile)
if theres any code i should post pls let me know
Thank u very much
Have you tried including the "Compressed" attribute for your MSIPackage entry? For example:
<Chain>
<!-- TODO: Define the list of chained packages. -->
<PackageGroupRef Id="Netfx4Full"/>
<MsiPackage Id="Myapp" SourceFile="$(var.Myapp.TargetPath)" Compressed="yes" Vital="yes" />
</Chain>
The "Compressed" attribute tells Burn to include your msi in the generated bootstrapper package. The "Vital" attribute tells Burn that your msi is required.
Also, burn packages write logs to your temp. directory. So look in there if it still fails.

make single Bundle project using Bootstrapper in Window installer XML

i have done a project for outlook add-ins. then i used WIX to create a setup file for this add-ins. But we need resolve the dependencies too, so i made a bootstrappper project using wix, which first check for the dependencies and then install add-ins using the setup file. it works good.
Problem
is there any way to merge these two setup project into single project. ?
here is my code for bootstrapper.
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Bundle Name="OutlookReport" Version="1.0.0.0" Manufacturer="Tzunami" UpgradeCode="93597211-ba8c-44f0-9f73-18e7afc47d85">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" >
<bal:WixStandardBootstrapperApplication LicenseFile="Resource\\EULA.rtf" LogoFile="Resource\\TzunamiLogo.png"
SuppressOptionsUI="yes"/>
</BootstrapperApplicationRef>
<util:ComponentSearch Id="SearchOutlook2010" Guid="CFF13DD8-6EF2-49EB-B265-E3BFC6501C1D" Variable="Outlook2010"/>
<util:ComponentSearch Id="SearchOutlook2010PIA" Guid="1D844339-3DAE-413E-BC13-62D6A52816B2" Variable="Outlook2010PIA"/>
<util:ComponentSearch Id="SearchOutlook2013" Guid="F9F828D5-9F0B-46F9-9E3E-9C59F3C5E136" Variable="Outlook2013"/>
<bal:Condition Message="This Setup need Outlook 2010 or 2013 to be installed">
Outlook2010 OR Outlook2010PIA OR Outlook2013
</bal:Condition>
<util:RegistrySearch Id="VSTORuntimeTest" Root="HKLM" Key="SOFTWARE\Microsoft\VSTO Runtime Setup\v4R\" Value="VSTORFeature_CLR40" Variable="VSTORFeature"/>
<util:RegistrySearch Id="VSTORuntimeVersionV4R" Root="HKLM" Key="SOFTWARE\Microsoft\VSTO Runtime Setup\v4R\" Value="Version" Variable="VSTORVersionV4R"/>
<util:RegistrySearch Id="VSTORuntimeVersionV4" Root="HKLM" Key="SOFTWARE\Microsoft\VSTO Runtime Setup\v4R\" Value="Version" Variable="VSTORVersionV4"/>
<Chain>
<PackageGroupRef Id="NetFx40Web"/>
<ExePackage Id="Downloading_Microsoft_VSTORuntime" SourceFile="Resource\\vstor_redist.exe" Permanent="yes" Vital="yes" Cache="no" Compressed="no"
DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=158917"
PerMachine="yes"
InstallCommand="/q /norestart"
DetectCondition="VSTORFeature"
InstallCondition="NOT VSTORFeature OR NOT (VSTORVersionV4R >=v10.0.40303) OR NOT (VSTORVersionV4 >=v10.0.21022)" />
<MsiPackage SourceFile="$(var.SetupOutlookReports.TargetPath)" Vital="yes" Compressed="yes" Id="OutlookReports" />
</Chain>
</Bundle>
</Wix>
You can chain in one bootstrapper inside other. Just modify Compressed="no" to Compressed="yes" in your exepackage, This will embed it in current project.