I have a c++ application developed using Visual Studio 2015, along with a Wix installer and a Burn bootstrapper. Previous versions of the application were able to use the Visual Studio merge module to install the necessary prerequisites, but it appears that this isn't an option when using Visual Studio 2015 (see Redistributables for deploying C++ exe developed with Visual Studio 2015 on Windows 7).
Following the advice in that link, we have started installing vcredist with Burn using an ExePackage with vital="yes". This mostly works great - we've had several customers who have the installation fail because of various issues with vcredist. Until recently, these were errors that should cause the installation to fail.
In the past couple of days we've received several reports of our installer failing due to a newer version of the redistributable being installed: vcredist fails with error code 0x80070666, which causes our bootstrapper to fail.
My questions are:
- Is deploying vcredist the "correct" approach to take? (Assuming we need to have a single exe installer)
- How can we tell what version of the redistributables are installed (not necessarily in the bootstrapper, is this information stored in a user readable form somewhere)?
- Is there a newer version of the redistributables that we should be distributing? (Currently using 14.0.23026) Is this based on the version of Visual Studio that is being used to compile or should we always distribute the latest version? (Current VS version 14.0.23107.0)
- As a last resort, is it possible to detect the error code returned from vcredist and allow that value to determine if the installation continues or fails?
to detect the presence of a vcredist package you need to search by its
UpgradeCode
.this will make sure that also later versions are found.
in a wix burn bootstrapper use
util:ProductSearch
with theUpgradeCode
parameter. and then specify a minimum version in theDetectCondition
.for full details see this answer: https://stackoverflow.com/a/35889484
Deploying vcredist is an appropriate approach to take.
You can use the FileSearch Element (Util Extension) to search for one of the vcredist files and retrieve its version. However this approach is complicated by the fact the burn built in variables
SystemFolder
andSystem64Folder
are reversed with respect the similar variables in Windows Installer. Example of searches for VC14:The variables
vc14x64Exists
andvc14x64Version
can then be used in aDetectCondition
to work out whether the 64 bit version of VC14 is installed:Similarly the
DetectCondition
for the 32 bit version of VC14 is:Note: In both cases you need to substitute
nnnnn
with the build number of the vcredist you are including in your installer.Edit 1: As an alternative you could detect the presence of VC Redist using an upgrade code search as outlined here.
Edit 2: In the installers that I author I generally don't try to detect the presence of VC Redist. Instead I let the VC Redist installer run and let itself figure out whether to install, upgrade or do nothing.
To date I've found three versions of the VC14 redist files:
a) 14.0.23026 - Downloadable from Microsoft's link here.
b) 14.0.23506 - Provided with Visual Studio 2015 Update 1.
c) 14.0.23918 - provided with Visual Studio 2015 Update 2.
Although newer versions of vcredist have been released with Visual Studio updates, Microsoft has not updated the version downloadable from their web site.
You can tell burn to ignore the already installed error code 0x80070666 using
<ExitCode Value="1638" Behavior="success"/>
. Note that 1638 = 0x666. For example:I ran into a similar problem recently where a product installer I was working on halted with error 0x80070666. The problem was a newer version of vcredist already installed. The solution I ended up using was: a) include the latest version of vcredist (14.0.23918), and b) add the
<ExitCode Value="1638" Behavior="success"/>
directive to tell burn not to throw an error if a future newer version of vcredist is already installed.