wix installer 3.7 bootstrapper Registry search - wix

<?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"
xmlns:netfx='http://schemas.microsoft.com/wix/NetFxExtension'>
<Bundle Name="IPDev" Version="0.6" Manufacturer="MYAPP Corporation" UpgradeCode="f380ae43-5df1-4cfe-9297-526e3e638e57">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Chain>
<!-- TODO: Define the list of chained packages. -->
<PackageGroupRef Id="Netfx45FullPackage"/>
</Chain>
</Bundle>
<Fragment>
<!--checking for matlab 2012a installation-->
<util:RegistrySearch Id="MatlabPath"
Variable="UniqueId"
Root="HKLM"
Key="SOFTWARE\MathWorks\MATLAB\4.17\"
Result="exists"
Win64="yes"
/>
<!--checking for matlab MCR 2012a 64 bit installation-->
<util:RegistrySearch Id="MatlabMCRPath"
Variable="UniqueId"
Root="HKLM"
Key="SOFTWARE\MathWorks\MATLAB Compiler Runtime\7.17\"
Result="exists"
Win64="yes"
/>
<PackageGroup Id="Netfx45FullPackage">
<ExePackage Id="Netfx45Xxx" Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="no" InstallCommand="/q"
SourceFile="..\SetupProject\dotnetfx45_full_x86_x64.exe"
DetectCondition="(Netfx4FullVersion="4.5.50709") AND (NOT VersionNT64 OR (Netfx4x64FullVersion="4.5.50709"))"
InstallCondition="(VersionNT >= v6.0 OR VersionNT64 >= v6.0) AND (NOT (Netfx4FullVersion="4.5.50709" OR Netfx4x64FullVersion="4.5.50709"))"/>
<ExePackage Id="MatlabMCR2012a64" Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="no" InstallCommand="/q"
SourceFile="..\SetupProject\MCR_R2012a_win64_installer.exe"
InstallCondition="(NOT MatlabPath) OR (NOT MatlabMCRPath)"/>
<MsiPackage Id="IPDev" Cache="no" Compressed="no" DisplayInternalUI="yes" Vital="yes" SourceFile="..\SetupProject\bin\Release\IPDevSetup.msi"/>
</PackageGroup>
</Fragment>
</Wix>
here's my code:
my problem is that .NET4.5 is installed only if it exists.
however MATLAB's MCR is installed whether it exists or not.
can you please tell me what's wrong with my condition:
InstallCondition="(NOT MatlabPath) AND (NOT MatlabMCRPath)"
fix after Rob's answer:
DetectCondition="MatlabMCRPathExists OR MatlabPathExists"
this condition should be false in order to install

Here is my final and working code:
this code check's for .NET 4.5 installation.
and for Matlab R2012a or Matlab MCR R2012a.
<?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"
xmlns:netfx='http://schemas.microsoft.com/wix/NetFxExtension'>
<Bundle Name="IPDev" Version="0.6" Manufacturer="Intel Corporation" UpgradeCode="f380ae43-5df1-4cfe-9297-526e3e638e57">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Chain>
<!-- TODO: Define the list of chained packages. -->
<PackageGroupRef Id="Netfx45FullPackage"/>
</Chain>
</Bundle>
<Fragment>
<!--checking for matlab 2012a installation-->
<util:RegistrySearch Id="MatlabPath"
Variable="MatlabPathExists"
Root="HKLM"
Key="SOFTWARE\MathWorks\MATLAB\4.17"
Result="exists"
Win64="yes" />
<!--checking for matlab MCR 2012a 64 bit installation-->
<util:RegistrySearch Id="MatlabMCRPath"
Variable="MatlabMCRPathExists"
Root="HKLM"
Key="SOFTWARE\MathWorks\MATLAB Compiler Runtime\7.17"
Result="exists"
Win64="yes" />
<PackageGroup Id="Netfx45FullPackage">
<ExePackage Id="Netfx45Xxx" Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="no" InstallCommand="/q"
SourceFile="..\SetupProject\dotnetfx45_full_x86_x64.exe"
DetectCondition="(Netfx4FullVersion="4.5.50709") AND (NOT VersionNT64 OR (Netfx4x64FullVersion="4.5.50709"))"
InstallCondition="(VersionNT >= v6.0 OR VersionNT64 >= v6.0) AND (NOT (Netfx4FullVersion="4.5.50709" OR Netfx4x64FullVersion="4.5.50709"))"/>
<ExePackage Id="MatlabMCR2012a64" Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="no" InstallCommand="/q"
SourceFile="..\SetupProject\MCR_R2012a_win64_installer.exe"
DetectCondition="MatlabMCRPathExists OR MatlabPathExists"/>
<MsiPackage Id="IPDev" Cache="no" Compressed="no" DisplayInternalUI="yes" Vital="yes" SourceFile="..\SetupProject\bin\Release\IPDevSetup.msi"/>
</PackageGroup>
</Fragment>
</Wix>

The InstallCondition attribute is used to determine whether a package should be installed on the machine. If true, the package is allowed to install. If false, the package is uninstalled. What you want is a DetectCondition attribute to determine whether the package is already present on the machine.
The fix is probably just to change the Matlab ExePackage/#InstallCondition to a ExePackage/#DetectCondition.

You can correct your RegistrySearch call like below:
<!--checking for matlab 2012a installation-->
<util:RegistrySearch Id="MatlabPath"
Variable="MatlabPathExists"
Root="HKLM"
Key="SOFTWARE\MathWorks\MATLAB\4.17\"
Result="exists"/>
<!--checking for matlab MCR 2012a 64 bit installation-->
<util:RegistrySearch Id="MatlabMCRPath"
Variable="MatlabMCRPathExists"
Root="HKLM"
Key="SOFTWARE\MathWworks\MATLAB Compiler Runtime\7.17\"
Result="exists"/>
<PackageGroup Id="Netfx45FullPackage">
This search sets the search result to the variable MatlabPathExists and MatlabMCRPathExists.
Then your condition check should be like following using those variables:
DetectCondition="(NOT MatlabPathExists) OR (NOT MatlabMCRPathExists)"

Related

Wix: getting WixUI_minimal to show when bootstrapper is used

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

how to check condtiotion for version check in bootstraper (wix)?

I am using bootstraper to install VC++ and .net framework,
<?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="Engage" Version="1.0.0.0" Manufacturer="my Corporation" UpgradeCode="d7d559b1-3388-4275-91e2-d8d44d2f02db">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Chain>
<!-- TODO: Define the list of chained packages. -->
<PackageGroupRef Id="Netfx45FullPackage" />
</Chain>
</Bundle>
<Fragment>
<PackageGroup Id="Netfx45FullPackage">
<ExePackage Id="Netfx45Xxx" Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="no" InstallCommand="/q" SourceFile=".\NDP452-x86-x64ENU.exe" />
<ExePackage Id="VC2013" Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="no" InstallCommand="/q" SourceFile=".\vcredist_x862013.exe" />
<MsiPackage Id="MyProg" Cache="no" Compressed="no" DisplayInternalUI="yes" Vital="yes" SourceFile="D:\Projects\Crimson\engage.client\EngageSetupCreator\bin\Debug\EngageSetupCreator.msi" />
</PackageGroup>
</Fragment>
</Wix>
currently iam installing those two without checking any condition, what should I do to check if the same version for vc++ and .netframework exist, and if exist skip the installation ?
no need to install again if already exists.
You need to add detect condition and use registry search to get the installed version.
For example:
<?define NetFx451MinRelease = 378675 ?>
<util:RegistrySearchRef Id="NETFRAMEWORK45"/>
<ExePackage Id="NetFx451"
...
DetectCondition="NETFRAMEWORK45 >= $(var.NetFx451MinRelease)"
...
>
</ExePackage>
Same for the vc++.

Prevent Burn from uninstalling .NET package

I'm using a WiX bootstrapper to install .NET and my application. The .NET installation is specified in a chain using the statement
<PackageGroupRef Id="NetFx40Redist">
When I uninstall using the bootstrapper, the .NET package is also uninstalled. How can I modify the above statement to tell the bootstrapper not to remove the .NET package?
EDIT: Following is the code I ended up writing to do this. Comments are welcome if there is anything I should do differently.
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
<Bundle Name="appName" Version="$(var.Version)" Manufacturer="mfr" UpgradeCode="your-GUID"
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Variable Name="InstallFolder" Type="string" Value="[ProgramFilesFolder]mfrName\appName" />
<Chain>
<PackageGroupRef Id="Net4Redist"/>
<MsiPackage
Id="MsiInstaller"
Compressed="yes"
SourceFile="$(var.SolutionDir)\appName_Installer\bin\$(var.Configuration)\appName_Installer.msi"
Permanent="no"
Vital="yes">
<MsiProperty Name="INSTALLLOCATION" Value="[InstallFolder]" />
</MsiPackage>
</Chain>
</Bundle>
<Fragment>
<PackageGroup Id="Net4Redist">
<ExePackage Id="Netfx40Xxx" Cache="no" Compressed="yes" PerMachine="yes"
Permanent="yes" Vital="yes" InstallCommand="/q"
SourceFile="$(var.SolutionDir)\Bootstrapper\redist\dotNetFx40_Full_x86_x64.exe"
InstallCondition="(VersionNT >= v6.0 OR VersionNT64 >= v6.0)"/>
</PackageGroup>
</Fragment>
</Wix>
Did you try using the "Permanent" attribute in the EXEPackage element?
EXEPackage
Glad you solved your issue but, as you mentioned, you do not have any detect condition setup so that is probably why you are seeing .NET processing every time you run your installer. If you add the following registry search and detect condition to your example you should not see that anymore:
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK40"/>
<PackageGroup Id="Net4Redist">
<ExePackage Id="Netfx40Xxx" Cache="no" Compressed="yes" PerMachine="yes"
Permanent="yes" Vital="yes" InstallCommand="/q"
SourceFile="$(var.SolutionDir)\Bootstrapper\redist\dotNetFx40_Full_x86_x64.exe"
DetectCondition="NETFRAMEWORK40"
InstallCondition="(VersionNT >= v6.0 OR VersionNT64 >= v6.0)"/>
</PackageGroup>
</Fragment>

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.