デスクトップ ブリッジと 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関数を使って工夫する必要があることを意味しています。