2016-01-15 29 views
6

私はVS 2015でコンパイルされたアプリケーションを持っており、正しく実行するにはVC++ Redistributableパッケージが必要です。この最新ビルド以前は、旧バージョンのVSを使用していましたが、単に適切なレアリストファイルのインストールを処理するためにマージモジュールを使用しました。しかし、私は2015(Microsoft_VC140_CRT_x64.msm)のマージモジュールの最新バージョンを使用しているときに、自分のアプリケーションがそのまま動作しないことに気付きました。 I did some diggingであり、マージモジュールの最新バージョンで変更されているものがあるようです。 Microsoftは現在、マージモジュールを使用する代わりに直接vcredist_x64.exeパッケージをインストールすることを推奨しているようです。WIXはインストール時にvcredist_x64.exeを実行します

私はこれを行うためのカスタムアクションを作成しようとしています。私はsimilar tutorial hereに従っていますが、VC Redistributable実行ファイルに適用しています。私がする必要がある最初の事は.exeファイルを一度インストール置かれようとしている設定です。

<Directory Id='APPLICATIONROOTDIRECTORY' Name='MyApp'> 
    <Directory Id="VCREDISTDIR" Name="VCRedist"> 
    </Directory> 
</Directory> 

その後、私は隠しの一部としてインストールされるコンポーネントグループに私のファイルを追加する必要があります(これを自動的にインストールしたいので)。この時点で

<ComponentGroup Id="VCRedist" Directory="VCREDISTDIR"> 
    <Component Id="vcredist_x64.exe" Guid="-INSERT-GUID-HERE-" Win64="yes"> 
    <File Id="VCREDISEXE" Name="vcredist_x64.exe" KeyPath="yes" Source="$(var.VCRedistSourceDir)" Checksum="yes"></File> 
    </Component> 
</ComponentGroup> 

そして...

<Feature Id="VCRedistributable" Title="Visual C++ Runtime" AllowAdvertise="no" Display="hidden" Level="1"> 
    <ComponentGroupRef Id="VCRedist" /> 
</Feature> 

、vcredist_x64.exeは、エンドユーザーのマシンにコピーする必要があります。今度は、インストール後に実行可能ファイルを起動するカスタムアクションを作成する必要があります。

<CustomAction Id="InstallVCRedistributable" 
      FileKey="VCREDISEXE" 
      Execute="deferred" 
      ExeCommand="/silent" 
      Impersonate="no" 
      Return="check"/> 

<InstallExecuteSequence> 
    <Custom Action="InstallVCRedistributable" Before="InstallFinalize"> 
    <![CDATA[NOT REMOVE]]> 
    </Custom> 
</InstallExecuteSequence> 

実行ファイルが実行されているとき、私が見ることができるように、私も自分のUIにステータスメッセージが含まれます。今

<UI> 
    <ProgressText Action="InstallVCRedistributable">Installing Visual C++ Redistributable for Visual Studio 2015</ProgressText> 
</UI> 

私は私のインストーラを実行すると、それがハングアップを取得しますそれはvcredist_x64.exeを起動する必要があります...そしてそれはありません...しかし、そののインストール中に実行可能。このWindowsインストーラパッケージに問題があり、セットアップの一部として実行されるプログラムが完了しなかったというポップアップメッセージが表示されます。その後、メインアプリケーションのインストールをロールバックし、インストールされることはありません。なぜこれが起こっているのか、どのように修正するのか説明できる人はいますか?ありがとう!

+0

FYIでは、ターゲットシステムにもUni​​versal CRTがインストールされている限り、インストーラーでMicrosoft_VC140_CRT_x64.msmを追加することはできます。マージモジュール自体はもはや完全に自己依存的ではありません。 –

答えて

3

独自のインストーラを持つ前提条件を持つときの正しいアプローチは、各インストーラを順番に実行するWiXブートストラップバンドルを作成することです。これは、インストーラの中からカスタムアクションを実行していない、インストール失敗時のロールバックなどを処理します。

ベアボーンサンプルはhereを見ることができ、あなたはそれらをインストールする必要があるために、Chain要素で<MsiPackage><ExePackage>を追加します。

+0

私は、ブートストラップを使わずに逃げたいと思っていました。しかし、それは不可能かもしれません。主な理由は、自分のEULAをさまざまな文化に自動的に表示するカスタムの.msiファイルがすでにあることです。ブートストラップアプリケーションでライセンスファイルを省略し、.msiをインストールしてからvcredist_x64.exeをインストールするだけでよいのかどうかはわかりません。しかし、私はもっと掘り起こす必要があると思う。これを行うための他の、おそらくもっと "エレガントな"または "msi-friendly"な方法があるなら、私に知らせてください。 – andyopayne

+0

また、カスタムアクションを使用して.exeファイルを起動する現在の実装が失敗している理由は誰にも分かりますか?それはうまくいくようです。それはvcredist_x64.exeにインストール時に使用条件に同意するように尋ねるチェックボックスがあるからです。インストーラが失敗する原因になりますか? – andyopayne

+0

起動時にMSIインストーラインターフェイスを表示させることができます。また、ブートストラップを設定することで、UIを持たないようにすることもできます。 –

5

私はこの質問を見つけ、同じ状況にある自分自身を試しました。エラー1618:「別のインストールがすでに進行中です。」と表示されているインストーラエラーが見つかりました。あなた自身のインストーラの中でvc_redistインストーラを実行するだけではうまくいかないようです。

あなたの他のオプションは、Patrick Allwoodが提案しているようにブートストラップを作成しているようですが、独自のインストーラを実行する前にvc_redistパッケージをインストールするようにユーザーに求めることもできます。ユニバーサルCランタイムはC:\Windows\System32ucrtbase.dllをチェックすることにより、既に存在している場合は、検出することができます:

<Property Id="UCRTINSTALLED"> 
    <DirectorySearch Id="UCRTSystemSearch" Path="[WindowsFolder]System32" Depth="0"> 
    <FileSearch Id="UCRTFileSearch" Name="ucrtbase.dll" MinVersion="10.0.10240.16389" /> 
    </DirectorySearch> 
</Property> 

あなたが唯一の32ビットのインストーラを持っている場合は、直接[SystemFolder]プロパティを使用することができます。

編集:Kevin Smythが述べたように、ucrtbase.dllのバージョンでは、いくつかのツールにはバージョン2.X、他のツールにはバージョン10.Yが報告されています。 ucrtbase.dllの存在を確認したい場合は、MinVersionプロパティを削除することができます。

+0

私はそれをMinVersionで動作させることができませんか? (私は "10.0.10586.0"私のucrtbase.dllにある)任意のアイデア? – Macke

+1

このMinVersionチェックは失敗します! 'win32api.GetFileVersionInfo( 'ucrtbase.dll'、 '\\')'は、Windows 10マシン上のファイルバージョンに対して '2.6.10586.0'を返します。 'sigcheck.exe'は' 10.0.10586.0'を返します。非常に奇妙な。さらに悪いことに、 'msiexec/i/log * xv'は有用なものを記録しません。私は 'MinVersion'を削除して動作します。 –

+0

FYI:ucrtbase.dllを見つけると、 "Universal CRT"がインストールされていることが確認されます。 UCRTはMSVC 2015の再配布可能ファイルの*要件*であり、vc_redist.exeはそれらが見逃された場合にインストールされます。ただし、UCRTはWindows Updateを通じて提供されるため、MSVC 2015再配布可能ファイルがインストールされていない状態でucrtbase.dllをインストールすることは可能です。 tl; dr:ucrtbase.dllの存在を使用して、vc_redist.exeを起動するかどうかを決定しないでください。 –

関連する問題