- ※適用バージョン:Windows 10 全バージョン(version 1507/build 12040以降)
はじめに
Windows 10に追加された新機能の多くはUWP(Universal Windows Platform)だけに搭載されます。そのような新機能は、従来の.NETのアプリからは使えないのでしょうか?
そんなことはありません。UWPの多くのAPIは、.NETのアプリからも簡単に利用できるのです。
今回は、日本語の漢字混じりの文字列から読み仮名を取得するAPIなどを題材にして、.NETアプリからUWPのAPIを呼び出せるようにする方法を紹介します。
対象読者
- .NET FrameworkでWindows用のアプリを作っている開発者
- UWPアプリの開発者
必要な環境
サンプルコード(GitHub)をそのまま試してみるには以下の環境が必要です。
- Windows 10 version 1703(build 15063)以降
- Visual Studio 2015 Update 3以降(無償のCommunity Editionで可)
- UWP用Windows 10 SDK:C#/VB用の10.0.15063以降
どんな機能なのか?
まずはサンプルコード(WPFアプリ)の画面を見てください(⇒UF02UwpDesktop)。
![UWPのAPIを使っているWPFアプリ](https://codezine.jp/static/images/article/10654/fig01.png)
このアプリはWPFです。リリースビルドしたものは、Windows 7などでも起動します(画面が表示されるだけで機能はしません)。Windows 10上で動いているときは、そのコードビハインドからUWPのAPIを呼び出して、読み仮名などを取得します。このように、従来の.NETアプリからUWPのAPIを利用できるのです。
このアプリの画面は次のようになっています。
- 1段目:ここに文字列を入力します
- 2段目:入力された文字列の読み仮名が表示されます
- 3段目:入力された文字列に振り仮名を付けて表示されます(この部分は1607/14393以降)
- 4段目:生成した読み仮名から得られたカナ漢字変換の候補を一覧します
2段目~4段目の出力は、UWPのAPIを使って得ています。ここで利用しているUWPのAPIは、形態素解析を行いつつ読みを推定します。例えば「須弥山登山計画」は、「須弥山/登山/計画」と3つの形態素に分割して「しゅみせん/とざん/けいかく」と読みを付けてくれます。この読み仮名を取得するAPIの使い方も、後ほど紹介します。
このように従来の.NETアプリからUWPのAPIを利用できるといっても、そのための作業が複雑なものであったなら気軽に利用したりはできません。今回の主題はそこになります。たいていはとても簡単にできるのです。
簡単! NuGetから導入する方法
追補:Windows 10 1803以降の場合
以降で説明しているUwpDesktopではなく、Windows 10 WinRT API Packを使います。これは2019年9月にリリースされたものです。
詳細はWindows Blogsの"Windows 10 WinRT API Packs released"を参照してください。ただし、この追補を書いている時点では、.NET Coreのプロジェクトでは問題なさそうでしたが、.Net Frameworkのプロジェクトでは限られたUWP APIしか使えないようでした。
(2019/11/9 追記)
さっそくやってみましょう。まず、Visual Studioを開き、WPFのプロジェクトを作ります(Windows Formsやコンソールアプリでも構いません)。
そうしたら、NuGetからUwpDesktopをプロジェクトに導入します。Visual Studio 2015での導入手順は、次のようになります。
- ソリューション エクスプローラーでプロジェクトを右クリックして[NuGet パッケージの管理]メニューを選択する
- 開いたNuGet パッケージ マネージャーの上部のタブで[参照]を選択し(次の画像の①)、検索ボックスに「UwpDesktop」と入力して(②)検索を実行する
- 検索結果に「UwpDesktop」が出てくるので(③)、それを選択してインストールする
![NuGetからUwpDesktopを導入](https://codezine.jp/static/images/article/10654/fig02.png)
たったこれだけで、もうUWPのAPIを使ったコーディングができます。
例えば次のように、MainWindowクラスのコンストラクターにコードを追加してみてください。
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // ピクチャ フォルダーのファイル一覧を取得してみる Task.Run(async () => { var files = await Windows.Storage.KnownFolders.PicturesLibrary.GetFilesAsync(); var myPictures = string.Join("\n", files.Select(f => f.Name)); MessageBox.Show(myPictures); }); } ……省略……
これで実行してみると、次の画像のようにピクチャ フォルダー内のファイル名一覧が表示されるはずです。UWPのAPIは、このように簡単に利用できるのです。
![ピクチャ フォルダーのファイル一覧が表示できた](https://codezine.jp/static/images/article/10654/fig03s.png)
こんなにあっさりと使えてしまうとは、拍子抜けもいいところですね! ただし、このUwpDesktopは開発が止まってしまっていて、Windows 10 version 1607/build 14393までにしか対応していません。1703/15063以降のAPIを利用したいときには、手動でセットアップすることになります(後述)。
Capability(「機能」)の宣言は不要
UWPパッケージにしていない.NET Frameworkのアプリでは、UWPのCapability(「機能」)宣言は不要です。上の例ではピクチャ フォルダーにアクセスするAPIを利用していますが、もしもUWPアプリであればパッケージ マニフェストにCapabilityの宣言が必要になるところです。同じAPIを従来のデスクトップアプリから呼び出す場合には、制限が掛からないのです(デスクトップ ブリッジでUWPパッケージ化すると制限が掛かります)。