手動でセットアップする方法
NuGetから導入するUwpDesktopは、1607/14393までにしか対応していません。1703/15063以降に追加されたAPIを利用するには、プロジェクトを手動でセットアップする必要があります。UwpDesktopを導入した上で追加の設定を行うこともできますが、ここではすべて手動で行う方法を説明します。この手順はMicrosoftのドキュメント「Windows 10 向けのデスクトップ アプリを強化する」に載っているものです。
その手順の概要は、UWPのAPIへの参照を追加することと、不要なファイルがビルド出力に含まれないように調整することです。
参照を追加する
まず、普通にWindows FormsやWPFなど.NETアプリのプロジェクトを作ってください(以下の例では、.NET Frameworkのユニットテストのプロジェクトを使っています)。そうしたらUWPのAPIを使うための参照を追加していきます。以降、Visual Studio 2015で説明します。
ソリューション エクスプローラーでプロジェクト内の[参照]を右クリックして[参照の追加]メニューを選びます。[参照マネージャー]ダイアログが出てくるので、[参照]ボタンをクリックします。出てきたファイル選択ダイアログで次に示すファイルを順に探して[追加]ボタンをクリックします(同じフォルダー内にあるファイルは、複数を選択してまとめて追加できます)。拡張子「.WinMD」ファイルを選択するときには、ファイル選択ダイアログで[追加]ボタンの上にあるドロップダウンを[すべてのファイル (*.*)]に変えないといけません(次の画像)。
参照を追加するファイル
最小限必要なファイルは以下の6つです。
- System.Runtime.InteropServices.WindowsRuntime.dll
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\{.NETバージョン}\ - System.Runtime.WindowsRuntime.dll
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\{.NETバージョン}\ - System.Runtime.WindowsRuntime.UI.Xaml.dll
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\{.NETバージョン}\ - Windows.WinMD
C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Facade\ - Windows.Foundation.FoundationContract.winmd
C:\Program Files (x86)\Windows Kits\10\References\{SDKバージョン}\Windows.Foundation.FoundationContract\{コントラクト バージョン}\ - Windows.Foundation.UniversalApiContract.winmd
C:\Program Files (x86)\Windows Kits\10\References\{SDKバージョン}\Windows.Foundation.UniversalApiContract\{コントラクト バージョン}\
ここで{.NETバージョン}は「v4.5」などです。目的の3ファイルが存在する最新のフォルダーを選んでおけばよいでしょう。本稿執筆時点では「v4.5.1」でした。
{SDKバージョン}は、Windows 10 SDKのバージョンで、「10.0.15063.0」や「10.0.16299.0」などです。15063以前のSDKでは、バージョン別のフォルダーには分かれていませんので({SDKバージョン}に相当するフォルダー階層がない)、後ろの{コントラクト バージョン}のみで識別することになります。
{コントラクト バージョン}は、15063以降ではフォルダーが1つだけのはずなので迷うことはないはずです。15063以前では、前回に紹介したDevice Family Extension SDKs and API contractsを調べてください。
【補足】15063以降はもっとシンプルに!(2018/4/10追記)
15063以降のSDKを利用する場合、追加する参照の最低限は2つだけでよいようです。公式ドキュメントに記述は見つけられませんでしたが、サンプルコード(AdaptiveCards.WPFなど)ではそうなっています。
15063以降では、最小限必要なファイルは以下の2つです。
- System.Runtime.WindowsRuntime.dll
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\{.NETバージョン}\ - Windows.WinMD
C:\Program Files (x86)\Windows Kits\10\UnionMetadata\{SDKバージョン}\
追加した参照の例
具体的に1703/15063のUWP APIを使うために追加した参照は以下のようになりました。
- System.Runtime.InteropServices.WindowsRuntime.dll
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5.1 - System.Runtime.WindowsRuntime.dll
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5.1 - System.Runtime.WindowsRuntime.UI.Xaml.dll
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5.1 - Windows.WinMD
C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Facade - Windows.Foundation.FoundationContract.winmd
C:\Program Files (x86)\Windows Kits\10\References\10.0.15063.0\Windows.Foundation.FoundationContract\3.0.0.0 - Windows.Foundation.UniversalApiContract.winmd
C:\Program Files (x86)\Windows Kits\10\References\10.0.15063.0\Windows.Foundation.UniversalApiContract\4.0.0.0
【補足】15063以降での具体例(2018/4/10追記)
前述のように、15063以降のSDKを利用するときに追加する参照の最低限は2つだけでよいようです。サンプルコードのプロジェクトファイル(⇒MsTestV2.csproj)も、そのように修正しました。ただし、Visual Studio 2017 Version 15.6.5を使っています。以前のVisual Studioで作業した場合は、当てはまらないかもしれません。
具体的に1703/15063のUWP APIを使うために追加した参照は以下のようになりました。
- System.Runtime.WindowsRuntime.dll
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5.1\ - Windows.WinMD
C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.15063.0\
なお、[参照マネージャー]ダイアログを使って参照を追加した場合、これらUWP APIを使うための参照ファイルへのパスは相対パスとしてプロジェクトファイルに記録されます。そのため、ソリューションのフォルダを移動すると、参照が無効になってしまうことがあります。そういうときは、プロジェクトファイルをエディタで直接開いて、絶対パスに書き直してください。
WinMDファイルをビルドに含めないようにする
参照を追加し終わったら、WinMDファイルは出力ディレクトリーにコピーされないように設定を変更します。ソリューション エクスプローラーの[参照]にあるWinMDファイルを選び、その下の[プロパティ]ペインで[ローカルにコピー]を探してTrueからFalseに変えます(次の画像)。追加したWinMDファイルすべてで作業します。
さらに必要に応じてWinMDへの参照を追加することもあるでしょうが、その際にも忘れずに[ローカルにコピー]はFalseに変えてください。
コードを書く
以上で、手作業でもUWPのAPIが使えるようになりました。例えば、サンプルコード(⇒MsTestV2)のUnitTest1.csでは、1607/15063で導入されたCodecQueryクラス(Windows.Media.Core名前空間)を使って、ドルビーAC3コーデックがサポートされているかどうか調べています(次のコード)。
var cq = new Windows.Media.Core.CodecQuery(); var codecList = await cq.FindAllAsync( Windows.Media.Core.CodecKind.Audio, Windows.Media.Core.CodecCategory.Decoder, Windows.Media.Core.CodecSubtypes.AudioFormatDolbyAC3); var codec = codecList.FirstOrDefault(); WriteLine(codec.DisplayName); // 出力:"Microsoft Dolby Digital Plus Decoder MFT"
MSTest V2
上記のサンプルコードではMSTest V2(MSTest.TestFramework 1.2.0)を使っています。MSTest V2のAPIドキュメントはMicrosoft.VisualStudio.TestTools.UnitTesting Namespaceにあります。
まとめ
UWPのAPIの多くは、従来の.NET Frameworkのアプリ(WPF/Windows Forms/コンソールプログラムなど)からも利用できます。その設定は、UwpDesktopを使えば簡単です。あるいは手作業で設定することもできます。
Windows 10の新機能を使ってアプリを作りたいと思ったとき、UWPアプリにする必要はないかもしれないのです。作りなれたWPFやWindows FormsからそのAPIを呼び出せるかどうか、まずは試してみましょう。
UWPアプリに興味が湧いてきた人へ
Windowsデスクトップ用アプリの開発はWindows Formsなら経験があるけど、ちょっとUWPアプリ開発も気になってきたという方へ。ぴったりの電子書籍を書きました!
『UWP アプリ開発 101 第2版: Windows Forms 開発者のための C# / XAML による UWP アプリ開発入門』 (BluewaterSoft 2017/7/1)
・Kindle版とUWPアプリ版があります。
・どちらも無料で最初の方を読めるので、とりあえず試し読みをしてみてください。