web-dev-qa-db-ja.com

Wix Burn vcredist

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で失敗し、ブートストラッパーが失敗します。

私の質問は:

  1. Vcredistの展開は「正しい」アプローチですか? (1つのexeインストーラーが必要であると仮定)
  2. インストールされている再配布可能ファイルのバージョンを確認するにはどうすればよいですか(必ずしもブートストラップに含まれているわけではありません。この情報はユーザーが読み取り可能な形式でどこかに保存されていますか)。
  3. 配布する必要がある再頒布可能パッケージの新しいバージョンはありますか? (現在14.0.23026を使用しています)これは、コンパイルに使用されているVisual Studioのバージョンに基づいていますか、それとも常に最新バージョンを配布する必要がありますか? (現在のVSバージョン14.0.23107.0)
  4. 最後の手段として、vcredistから返されたエラーコードを検出し、その値を使用してインストールが続行するか失敗するかを判断することは可能ですか?
19
Runt8
  1. Vcredistのデプロイは、適切なアプローチです。

  2. 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およびvc14x64VersionDetectConditionで使用して、64ビットバージョンのVC14がインストールされているかどうかを確認できます。

    DetectCondition="vc14x64Exists AND vc14x64Version &gt;= v14.0.nnnnn"
    

    同様に、VC14の32ビットバージョンのDetectConditionは次のとおりです。

    DetectCondition="vc14x86Exists AND vc14x86Version &gt;= v14.0.nnnnn"
    

    注:どちらの場合も、nnnnnを、インストーラーに含めるvcredistのビルド番号に置き換える必要があります。

    編集1:別の方法として、VC Redistの存在を検出することができます。 ここ

    編集2:私が作成したインストーラーでは、通常、VC Redistの存在を検出しようとはしません。代わりに、VC Redistインストーラーを実行させ、インストール、アップグレード、または何もしないかを判断させます。

  3. これまでに、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サイトからダウンロード可能なバージョンを更新していません。

  4. <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がエラーをスローしないように指示することですインストールされています。

29
bradfordrg

vcredistパッケージの存在を検出するには、UpgradeCodeで検索する必要があります。
これにより、新しいバージョンも確実に検出されます。

wix書き​​込みブートストラップでは、UpgradeCodeparameterとともにutil:ProductSearchを使用します。次に、DetectConditionminimumバージョンを指定します。

詳細については、私の回答をご覧ください: https://stackoverflow.com/a/35889484

2
Opmet