デスクトップ ブリッジと VC ランタイムについて

Windows 10 Fall Creators Update がリリースされて、Visual Studio 2017 も Fall Creators Update 対応の 15.4 がリリースされています。今回は、Visual C++ のランタイムと デスクトップ ブリッジの関係を整理します。Visual C++ ランタイムとデスクトップ ブリッジの関係は、アプリのパッケージ化の準備というドキュメントにも記載がありますが、要点だけに焦点を当てます。Visual C++ 11(Visual Studio 2012) から Visual Studio 2017(VC14) とデスクトップ ブリッジの関係を示します。

VS バージョン VC バージョン 備考
2012 VC11 ダウンロード センター
2013 VC12 ダウンロード センター
2015 VC14 ダウンロード センター
2017 VC14 VS に含まれます

Visual C++ のメジャー バージョン 14 は、Visual Studio 2015 と Visual Studio 2017 に採用されているものになります。Visual Studio 2017 の VC++ では、言語機能の拡張なども行われていますのでマイナー バージョンなどは Visual Studio 2015 と異なることになります。ここに記載している以外の Visual C++ や他のコンパイラの場合は、C ランタイムをスタティック リンクしている場合が、デスクトップ ブリッジで動かすのに簡単な方法になります。スタティック リンクできていない場合は、実行ファイルと同じ場所にランタイム DLL などを配置して、ランタイムをロードできるようにする方法などでもデスクトップ ブリッジで使えるようになります。

VC14 以降とそれ以前は、VC ランタイムの扱いが大幅に変更されています。それは、VC14 以降で VC ランタイムが再設計されていまして、Windows 10 に含まれるようになったことから、ユニバーサル C ランタイム(UCRT) と呼ばれおり、VC ランタイム自体のスタティック リンクができなくなったことです。このため、Windows 7 や Windows 8.1 にバイナリを配布する場合は、VC ランタイムの再配布モジュールをインストールする必要があります。配布対象の Windows 10 に VC14のランタイムが含まれていない場合は、Windows Update 経由で導入するか、再配布モジュールでインストールします。
※VC14でスタティック リンクできないのは、VC ランタイムだけである点にご注意ください。自分で開発したライブラリについては、スタティック リンクすることができます。

前述の表に記述した VCバージョンは、デスクトップ ブリッジで使用する場合にダイナミック リンクで使用するのが簡単になります。ダイナミック リンクを使用する場合は、備考欄のダウンロード リンクより、デスクトップ ブリッジ用のランタイムをダウンロードしておく必要があります。
Visual Studio 2017 の場合は、「%ProgramFiles(x86)\Microsoft SDKs\Windows Kits\ExtensionSDKs\Microsoft.VCLibs.Desktop\14.0\Appx」フォルダにランタイムの Appx パッケージがあります。

これらのランタイム パッケージを使用するには、「Using Visual C++ Runtime in Centennial project」の記事に記載されていますが、AppxManifest.xml の 「Dependencies」要素に次のように記載します。
VC11 の場合

 <PackageDependency Name=”Microsoft.VCLibs.110.00.UWPDesktop” MinVersion=”11.0.61135.0″ Publisher=”CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US” />

VC12 の場合

 <PackageDependency Name=”Microsoft.VCLibs.120.00.UWPDesktop” MinVersion=”12.0.40653.0″ Publisher=”CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US” />

Visual Studio 2015(VC14) の場合

 <PackageDependency Name=”Microsoft.VCLibs.140.00.UWPDesktop” MinVersion=”14.0.23810.0″ Publisher=”CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US” />

Visual Studio 2017(VC14) の場合

 <PackageDependency Name=”Microsoft.VCLibs.140.00.UWPDesktop” MinVersion=”14.0.25426.0″ Publisher=”CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US” />

記載したバージョン番号は、ダウンロードなどして入手したランタイム内に存在する SDKManifest.xml と Appx 内の AppxManifes.xml で確認したものになります。 デバッグ用のランタイムを指定する場合は、「Name属性」と「MinVersion属性」を変更する必要があります。このランタイムは、最小バージョンが指定されていますので、Visual Studio 2015 で開発したものも、最新の VC14 ランタイムで動作する可能性がありますので、十分な動作確認を行ってください。
逆に、Visual Studio 2017 で開発したバイナリは、Visual Studio 2015 のランタイムしかない場合は動かないとお考えください。これは、ランタイムのバージョン番号は、上位互換が基本となるからです。

VCのランタイムは、開発した Appx パッケージのテスト時は手作業(Add-AppxPackage)でインストールする必要はありますが、ストアで公開できた場合は、アプリのインストール時に自動的にインストールされるものになります。

Desktop App Converter は、バージョン 2.1.1.0がリリースされており、ベースイメージも Fall Caretors Update向けがリリースされていますので、Fall Creators Updateでも問題なくアプリ パッケージの開発を行うことができるようになっています。

最後に、Windows SDK を基準に考えた場合の、VC ランタイムというか、バージョンについて説明します。Windows 10 SDK に対応しているのは、Visual Studio 2015 / 2017 の VC14 になります。一方で、Windows 8.1 SDK には Visual Studio 2012以降のバージョンが対応しています。このことは、Windows 10 SDK を使用する場合は、ユニバーサル C ランタイムを使うということを意味します。つまり、

  • Windows 8.1 SDK:このSDKまでは、従来の VC ランタイムをベースにしています。
  • Windows 10 SDK:ユニバーサル C ランタイム(UCRT) をベースにしています。

ということを意味します。このことは、Windows 8.1 SDK を使って Windows 10 で追加された API を使用する場合は、LoadLibrary関数を使って工夫する必要があることを意味しています。