Visual C++ 14 (VS2015RC)のランタイムをインストールする
Universal CRT
Visual C++ 14 (VS2015RC)では、 Universal CRT というものが導入されており、従来とはランタイムのインストール方法が変わっています。
Introducing the Universal CRT - Visual C++ Team Blog - Site Home - MSDN Blogs
具体的に何が変わっているかというと、例えば、MSIのインストーラ内で、従来通りに、 Microsoft_VC140_CRT_x86.msm や、 Microsoft_VC140_CRT_x64.msm をインストールしても、ランタイムが完全にインストールされたことを保証できません。
具体的に言うと、下の例だと、緑の部分はこのMSMによってインストールされますが、赤の部分はインストールされません!
じゃぁ、この、 API-MS-WIN-CRT-* っていうのはどうやってインストールするわけ?って話なんですが、
でダウンロードできる vc_redist.xXX.exe でインストールするか、さもなくば、
C:\Program Files (x86)\Windows Kits\10\Redist\ucrt
にある、OS毎の MSP を使ってインストールするしかないです。両方とも、既に Go-Live なライセンスの再配布可能パッケージなので、これを再配布してインストールするのは何にも問題無いです。
この MSP ですが、KB2999226 という名前になっており、どうやら、そのうちに対応OS群に対しては Windows Update 経由で降ってくるらしいです。なので、無理しなくてもそのうち自動で入ります・・・ってそれじゃ心配だから、わざわざ再配布可能になっている訳ですけどね。
皆さんにお伝えするべきことはここまでです。おしまい。
はい。
ブートストラッパプロジェクトで使いたい
vc_redist.xXX.exe をサイレントインストールすれば良いんだろ?って話で終了なんですが、せっかくなので、これをブートストラッパプロジェクトで利用できるように product.xml/package.xmlを作ってみます。
VS2013用のvcredust_xXXをパクって作ってみようと思うんですが、
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\Bootstrapper\Packages\vcredist_x86
を眺めてみたところ、 en\package.xml はまるで難しくないですね。
メッセージとダウンロードリンクしか有りません。適当に修正すれば良いでしょう。
VCRedistExeで設定されているダウンロードリンクに関しては、VS2015RCのものは、それぞれ、
http://download.microsoft.com/download/0/4/1/041224F6-A7DC-486B-BD66-BCAAF74B6919/vc_redist.x86.exe
http://download.microsoft.com/download/0/4/1/041224F6-A7DC-486B-BD66-BCAAF74B6919/vc_redist.x64.exe
からダウンロードできるので、リンクを差し替えるだけで良いようです(上記リンクが死なないとは一言も言ってないので注意; 直リンクじゃない奴が知りたい)。
さて、問題は、 product.xml の方です。
PackageFile を見てみると、
<PackageFile Name="vcredist_x86.exe" HomeSite="VCRedistExe" PublicKey="3082010a0282010100ee5bbe7d1124e38606e066ff48b517bd02e4b40c32f0723e7d2e87d74ea1b1a7432ff7659e31e1323145aed7c1248421d72eb5847efa35d3531cd7b6511e4fce66b9ebb70c02fd295cada887f6ca22b4d5bf0875f58a708f63d7ef8a1ee98f4324645ad3877d906d3bac76cd57367de8bc1056ac98f0895d2e64c6af26095e1e6315f13dbf168f998802c330b7c10b601f0f72ccd6b7a83512869ba10b0ae6935b8efa549cc1f3195f428d129f1d3f90b72713831932821df3d987d421b23ca2b6074fd724aaee8df5b3d9faf9394fa7e9f2af5952f4dc419b2f117063ddeadeaaf16d2104105333bbb24fc5e153b24165476e37f6bce99b1641916b2e5b30c30203010001" />
とあります。
Name はそのまま書き換えれば良いし、HomeSite は、おそらく、さっきのリンク文字列に差し替わるのかな?的な予想が出来ますが、PublicKey とはなんぞや。
仕方が無いのでMSDNでも見てみると、
<PackageFiles> Element (Bootstrapper)
には、
PublicKey - The encrypted public key of the package's certificate signer. Required if HomeSite is used; otherwise, optional.
とあります。なるほど。
さっきのリンクからダウンロードしてきた、 vcredist_x86.exe のプロパティからデジタル署名を見てみると、とりあえず、今時は、 SHA-1 と SHA-256 のデュアル署名になってるんですねー。感心ですね。っていう話になるんですが、とりあえず、 SHA-1 の方を選択して、[詳細]をクリックします。
Microsoft Corporation の署名の詳細が出てくるので、
ここで、[証明書の表示]をクリックして、二つ目のタブの「詳細」から、「公開キー」というものを選択します。
そうすると、下に16進でデータが出てきますが、このデータから空白を除去したものが、上記の PublicKey と一致するようです。
あとは、
<MsiProductCheck Property="VCRedistInstalled" Product="{13A4EE12-23EA-3371-91EE-EFB36DDFFF3E}"/>
にある Product は、 MSIのプロダクトコードですが、これは、 vcredist_x86.exe を ZIP として展開して、 0 っていうファイルを開くと、中に、vcRuntimeMinimum_x86 の CacheId や ProductCode として記述されているので、それをコピーしてくるだけですね。
ということで、vc_redist.x86.exe 向けに修正した product.xml
<?xml version="1.0" encoding="utf-8" ?> <Product xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" ProductCode="Microsoft.Visual.C++.14.0.x86"> <!-- Defines list of files to be copied on build --> <PackageFiles CopyAllPackageFiles="false"> <PackageFile Name="vc_redist.x86.exe" HomeSite="VCRedistExe" PublicKey="3082010a028201010096715ded0646fa84cb9d5bb746c7b0e1b4113903adb11573609ceba7b66e1a3c3fff65e334f1a6a5215e56996c58e492a10a5cc2d3dc522f0c659a20614053319c6c8f217dbaf9fe13505260953a5bb958a5746141a994e0ad264e4ca1977049275e7c67ca4f1e718446bc1d4bb6e20fc5c627c907e67a0aa51700194c7045382d81b450aac567d1fa79bcc5cca1729bf4253498f854df123938122fa46ba59a7ec762d1dccfed3d34f8b9df3530baec7932a9e1a9ac554d4c7f4c56c3130b76f107f9cc47acfb88d552a51e28fa3d2dcfcf849886716511cf85c9094486e16fe7b1fcac4044a5a98b233f82499dd596595013591873ff430cad2bd47f3040670203010001" /> </PackageFiles> <InstallChecks> <MsiProductCheck Property="VCRedistInstalled" Product="{AB18FCF2-8362-3DA1-9877-B5365547FCAF}"/> </InstallChecks> <!-- Defines how to invoke the setup for the Visual C++ 15 redist --> <!-- TODO: Needs EstimatedTempSpace, LogFile, and an update of EstimatedDiskSpace --> <Commands Reboot="Defer"> <Command PackageFile="vc_redist.x86.exe" Arguments=' /passive'> <!-- These checks determine whether the package is to be installed --> <InstallConditions> <BypassIf Property="VCRedistInstalled" Compare="ValueGreaterThanOrEqualTo" Value="3"/> <!-- Block install if user does not have admin privileges --> <FailIf Property="AdminUser" Compare="ValueEqualTo" Value="false" String="AdminRequired"/> <!-- Block install on Win95 --> <FailIf Property="Version9X" Compare="VersionLessThan" Value="4.10" String="InvalidPlatformWin9x"/> <!-- Block install on Vista or below --> <FailIf Property="VersionNT" Compare="VersionLessThan" Value="6.00" String="InvalidPlatformWinNT"/> </InstallConditions> <ExitCodes> <ExitCode Value="0" Result="Success"/> <ExitCode Value="3010" Result="SuccessReboot"/> <DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure" /> </ExitCodes> </Command> </Commands> </Product>