SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

UWPアプリ開発の最前線

超簡単! WPFなどの.NETのアプリからUWPのAPIを使う
~日本語の読み仮名を取得するAPIを題材に

UWPアプリ開発の最前線 第2回


  • X ポスト
  • このエントリーをはてなブックマークに追加

手動でセットアップする方法

 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」ファイルを選択するときには、ファイル選択ダイアログで[追加]ボタンの上にあるドロップダウンを[すべてのファイル (*.*)]に変えないといけません(次の画像)。

ファイル選択ダイアログ
[すべてのファイル (*.*)]にして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ファイルすべてで作業します。

[ローカルにコピー]をFalseにした
WinMDファイルは[ローカルにコピー]をFalseにする

 さらに必要に応じてWinMDへの参照を追加することもあるでしょうが、その際にも忘れずに[ローカルにコピー]はFalseに変えてください。

コードを書く

 以上で、手作業でもUWPのAPIが使えるようになりました。例えば、サンプルコード(⇒MsTestV2)のUnitTest1.csでは、1607/15063で導入されたCodecQueryクラス(Windows.Media.Core名前空間)を使って、ドルビーAC3コーデックがサポートされているかどうか調べています(次のコード)。

システムがサポートしているコーデックを取得する(1607/15063以降)
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"
1607/15063のUWP APIを使うユニットテスト
1607/15063のUWP APIを使うユニットテスト

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アプリ版があります。
・どちらも無料で最初の方を読めるので、とりあえず試し読みをしてみてください。

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
UWPアプリ開発の最前線連載記事一覧

もっと読む

この記事の著者

biac(ばいあっく)

HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来30年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。2014/10~2019/6 Microsoft MVP (Windows Devel...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10654 2019/11/09 15:44

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング