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によってインストールされますが、赤の部分はインストールされません!


f:id:espresso3389:20150508025443p:plain

じゃぁ、この、 API-MS-WIN-CRT-* っていうのはどうやってインストールするわけ?って話なんですが、

Download Visual C++ Redistributable for Visual Studio 2015 RC from Official Microsoft Download Center

でダウンロードできる 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 の方を選択して、[詳細]をクリックします。

f:id:espresso3389:20150508031958p:plain

Microsoft Corporation の署名の詳細が出てくるので、

f:id:espresso3389:20150508032005p:plain

ここで、[証明書の表示]をクリックして、二つ目のタブの「詳細」から、「公開キー」というものを選択します。

そうすると、下に16進でデータが出てきますが、このデータから空白を除去したものが、上記の PublicKey と一致するようです。

f:id:espresso3389:20150508032011p:plain

あとは、

<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>