Visual Studio 2015を使用して開発されたc ++アプリケーションを、WixインストーラーとBurnブートストラップと共に使用しています。以前のバージョンのアプリケーションはVisual Studioマージモジュールを使用して必要な前提条件をインストールできましたが、これはVisual Studio 2015を使用する場合のオプションではないようです( を参照してください) Windows 7のVisual Studio 2015で開発されたexe )。
そのリンクのアドバイスに従って、Vital = "yes"のExePackageを使用してBurnでvcredistをインストールし始めました。これはほとんど問題なく動作します。vcredistのさまざまな問題が原因でインストールが失敗するお客様が何人かいます。最近まで、これらはインストールが失敗する原因となるエラーでした。
過去2日間に、新しいバージョンの再配布可能ファイルがインストールされているためにインストーラーが失敗したという報告をいくつか受け取りました。vcredistがエラーコード0x80070666で失敗し、ブートストラッパーが失敗します。
私の質問は:
Vcredistのデプロイは、適切なアプローチです。
FileSearch Element(Util Extension) を使用して、vcredistファイルの1つを検索し、そのバージョンを取得できます。ただし、この方法は、組み込み変数SystemFolder
およびSystem64Folder
がWindowsインストーラーの同様の変数に関して逆になっているため、複雑です。 VC14の検索例:
<!-- Detect existing version of VC ++ 2015 x64 libraries -->
<util:FileSearch Id="GetVC14X64Exists" Condition="VersionNT64" Variable="vc14x64Exists" Path="[SystemFolder]vcruntime140.dll" Result="exists"/>
<util:FileSearch Id="GetVC14X64Version" Condition="VersionNT64" Variable="vc14x64Version" Path="[SystemFolder]vcruntime140.dll" Result="version"/>
<!-- Detect existing version of VC ++ 2015 x86 libraries -->
<util:FileSearch Id="GetVC14X86onX64Exists" Condition="VersionNT64" Variable="vc14x86Exists" Path="[System64Folder]vcruntime140.dll" Result="exists"/>
<util:FileSearch Id="GetVC14X86onX64Version" Condition="VersionNT64" Variable="vc14x86Version" Path="[System64Folder]vcruntime140.dll" Result="version"/>
<util:FileSearch Id="GetVC14X86onX86Exists" Condition="NOT VersionNT64" Variable="vc14x86Exists" Path="[SystemFolder]vcruntime140.dll" Result="exists"/>
<util:FileSearch Id="GetVC14X86onX86Version" Condition="NOT VersionNT64" Variable="vc14x86Version" Path="[SystemFolder]vcruntime140.dll" Result="version"/>
次に、変数vc14x64Exists
およびvc14x64Version
をDetectCondition
で使用して、64ビットバージョンのVC14がインストールされているかどうかを確認できます。
DetectCondition="vc14x64Exists AND vc14x64Version >= v14.0.nnnnn"
同様に、VC14の32ビットバージョンのDetectCondition
は次のとおりです。
DetectCondition="vc14x86Exists AND vc14x86Version >= v14.0.nnnnn"
注:どちらの場合も、nnnnn
を、インストーラーに含めるvcredistのビルド番号に置き換える必要があります。
編集1:別の方法として、VC Redistの存在を検出することができます。 ここ 。
編集2:私が作成したインストーラーでは、通常、VC Redistの存在を検出しようとはしません。代わりに、VC Redistインストーラーを実行させ、インストール、アップグレード、または何もしないかを判断させます。
これまでに、VC14 redistファイルの3つのバージョンを見つけました。
a)14.0.23026-Microsoftのリンク here からダウンロードできます。
b)14.0.23506-Visual Studio 2015 Update 1で提供されます。
c)14.0.23918-Visual Studio 2015 Update 2で提供されます。
Visual Studioの更新により、vcredistの新しいバージョンがリリースされましたが、MicrosoftはWebサイトからダウンロード可能なバージョンを更新していません。
<ExitCode Value="1638" Behavior="success"/>
を使用して、すでにインストールされているエラーコード0x80070666を無視するようにburnに指示できます。 1638 = 0x666であることに注意してください。例えば:
<!-- Microsoft Visual C++ 2015 x86 libraries -->
<PackageGroup Id="VC14RedistX86">
<ExePackage
Cache="no"
Compressed="yes"
PerMachine="yes"
Permanent="yes"
Vital="yes"
Name="Redist\vcredist14_x86.exe"
SourceFile="$(var.RedistPath)\VC14\vcredist_23918_x86.exe"
InstallCommand="/install /quiet /norestart">
<!-- -->
<ExitCode Value="3010" Behavior="forceReboot"/>
<!-- Ignore "Newer version installed" error -->
<ExitCode Value="1638" Behavior="success"/>
</ExePackage>
</PackageGroup>
最近、同様の問題に遭遇しました。私が作業していた製品インストーラーがエラー0x80070666で停止しました。問題は、すでにインストールされているvcredistの新しいバージョンでした。最終的に私が使用したソリューションは、a)vcredistの最新バージョン(14.0.23918)を含めること、およびb)<ExitCode Value="1638" Behavior="success"/>
ディレクティブを追加して、vcredistの将来の新しいバージョンがすでにある場合にBurnがエラーをスローしないように指示することですインストールされています。
vcredistパッケージの存在を検出するには、UpgradeCode
で検索する必要があります。
これにより、新しいバージョンも確実に検出されます。
wix書き込みブートストラップでは、UpgradeCode
parameterとともにutil:ProductSearch
を使用します。次に、DetectCondition
にminimumバージョンを指定します。
詳細については、私の回答をご覧ください: https://stackoverflow.com/a/35889484