Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
今回は、Desktop App Converter のチュートリアル的なサンプルであり、DesktopBridge Sample を紹介します。具体的には、実際のコードを見て頂くとして、この記事ではどのようなサンプルが提供されていて、どのような構造になっているかを解説します。
最初の入門として見るのは、HelloWorldSample か JourneyAcrossTheBridge のサンプルになります。
HelloWorldSample
cs フォルダと CentennialPackage フォルダが含まれており、cs フォルダが C# のコンソール アプリケーションになっており、CentennialPackage フォルダは、手作業でAppxを作成するための Appx レイアウト フォルダになっています。このサンプルでは、Desktop App Converter を使用することなく、デスクトップ アプリを Appx パッケージにすることを学習するためのものになっています。
JourneyAccrossTheBridge
このサンプルには、ステップ1からステップ5までの5種類が含まれています。学習の流れで説明すると、ステップ1 から ステップ 3が、Windows Forms のデスクトップ アプリを Appx 化 (ステップ1) して、タイル更新を追加(ステップ2)、バックグラウンド タスクを追加(ステップ3) と順番に既存のデスクトップ コードを機能拡張する流れになっています。
ステップ 4 以降は、それまでの流れではなく、UWP のアプリから デスクトップのコードを アプリ サービスとして使用し(ステップ4)、完全な UWP アプリへの移行(ステップ 5)となっています。
ステップ1
学習することは、HelloWorldSample と同じです。異なるのは、コンソール アプリではなく、Windows Forms を使用した GUI のアプリという点であり、使用する Visual Studio が 2015 ではなく、2017(プレビュー)になっており、Desktop to UWP packaging Project を使用するようになっていることです。Desktop to UWP Project で作成したプロジェクトは、Appxレイアウトのフォルダを指定し、変換対象のプロジェクトをソリューションに追加することで、Appx の更新やデバッグが容易になるという特徴があります。Desktop to UWP Project の使い方は、変換済みの UWP アプリを展開してデバッグするに記述されている「F5デバッグ」で詳しく説明しています。
ステップ2
タイル更新を追加するために、Windows.wnimd への参照を追加してから、コンボボックスのSelectionChanged イベント ハンドラ内に TileUpdateManager クラスと TileNotification クラスを使用してタイル通知を行うコードを追加しています。
ステップ3
ステップ2 へバックグラウンド タスクを追加するために、BackgroundTasks プロジェクトを Windows ランタイム コンポーネント プロジェクトとして追加しています。このバックグラウンド タスクは、アプリケーション設定の「Status」キーに設定された文字列を使って、トースト通知を行います。
AppxManifest へバックグラウンド タスクを追加するには、以下の3種類の作業が必要になります。
- Extension 要素で UWP アプリと同様に windows.backgroundTasks の設定を行います。
- Extension 要素で windows.activatableClass.inProcessServer の設定を行います。
この理由は、デスクトップのアプリなので、アプリの仕組みを自動的に使えないためです。 - 作成した BackgroundTasks.winmd と BackgroundTasks.pri を Appx レイアウトへコピーしておきます。
Windows Forms のアプリケーションでは、以下の作業を行っています。
- Program.cs で、バックグラウンド タスクの登録を行います。コードは、UWP アプリで使用するものと同じです。
- Form1.cs で、Form1_Load イベント ハンドラでアプリケーション設定の [Status] キーへ文字列を設定します。
こうすることで、バックグラウンド タスクが Time トリガーによって 15 分間隔でトースト通知を表示するようになります。
ステップ4
既に説明したように、ここでステップ 3までとは異なる構造へと変わります。具体的には、MyDesktopApp プロジェクト (デスクトップ のアプリ)、BackgroundTasks プロジェクト (これは、ステップ3のものと同じです)、最後に MyUWPApp プロジェクト(純粋な UWP アプリ)の 3 プロジェクトで構成されていて、ステップ 3まで存在していた Desktop to UWP Project は無くなっています。この理由は、MyUWPApp という UWP アプリで配置などを行うからです。
MyDesktopApp プロジェクトの特徴は、次のようになります。
- C# のコンソール アプリケーションです。
- Windows.winmd への参照設定を行っています。
- レジストリに設定している CurrentState を アプリケーション設定の [Status] キーへ保存します。
- 新しいスレッドで AppService をホストするコードを記述しています。AppService で CurrentState を ValueSet をクライアントへ返します。
MyUwpApp プロジェクトの特徴は、次のようになります。
- ターゲット プラットフォームを 10.0.14393.0 に固定します。
- BackgroundTasks プロジェクトへ参照を設定します。
- Windows Desktop Extension 10.0.14393 拡張SDK への参照を設定します。
- ポスト ビルドで、MyDesktopApp の出力である exe と pdb を$(OutDir)AppX フォルダーへコピーします。
- App.xaml.cs の OnBackgroundActivated イベント ハンドラで、AppService の処理を記述し、メッセージを受信したら StatusUpdated イベントを呼び出します。
- MainPage.xaml.cs で、StatusUpdate イベントのハンドラを記述し、受信したメッセージでコンボボックスを選択するコードを記述しています。
OnNavigatedTo イベント ハンドラで、バックグラウンド タスクの登録をし、FullTrustProcessLauncher クラスを使って MyDesktopApp を起動します。
コンボボックスの SelectionChanged イベント ハンドラで、MyDesktopApp のApp Service へメッセージを送信し、受信したデータでタイル更新をします。 - Package.appxmanifestには、次のような変更を加えています。
デバイス ファミリ を Windows.Desktop に固定。
ネームスペースに、rescap と desktop を追加。
Extension にバックグラウンド タスクと windows.appServiceの定義を追加し、desktop:Extension 要素で windows.fullTrsustProcess として MyDesktopApp.exe を追加し、rescap:Capability runFullTrust を追加します。
このような構造になっています。ここでポイントは、デスクトップ アプリが AppService をホストしている点と UWP アプリが デスクトップ アプリの AppService を起動するために、FullTrustProcessLauncher クラスを使用している点です。通常の UWP アプリ同士であれば、AppService 側は自動的に起動されますが、デスクトップ アプリでAppService をホストするケースでは、自動的に起動できないので、UWP アプリ 側で起動する必要があるということになります。このための設定が、desktop:Extension の windows.FullTrustProcessになり、この記述は Appx内に同梱した完全信頼の実行ファイルを 1 つだけ記述することができます。
ステップ5
ステップ 4までのソリューションを完全な UWP アプリ化するために、MyUWPAppプロジェクトとBackgroundTasks プロジェクトの 2つだけに統合します。
BackgroundTasksSample
JourneyAccrossTheBridge のステップ 3 と同じになります。
AppServiceBridgeSample
C# と C++ を使用したサンプルがありますが、考え方は JourneyAccrossTheBridge のステップ 4 と同じになります。
NorthwindSample
C# のサンプルで AppService を使用しますので、JourneyAccrossTheBridge のステップ 3と同様の考え方でなりたっていますが、Northwindという名前から予測できるように SQL Compact を使ったデータベースへのアクセスをラップした C# のデスクトップ アプリを使用しています。
StoreSample
ストアのAPIを使用する C# のWPF アプリケーションで、Desktop to UWP packaging Project を使用しています。
このサンプルを通して DAC で変換したアプリを拡張する時に注意点は、以下のようなことになります。
- Windows メタデータへの参照設定が必要
C++ の場合は、Windows ランタイムを使用できる Windows SDK を使用する必要がある - UWP アプリから、Appx 内のデスクトップ実行ファイルを起動するには、FullTrustProcessLauncher クラスを使用する。
同梱できるデスクトップ実行ファイルは 1つだけという制限がある。 - 拡張するには、AppService などがやりやすい。
- タイルやトースト通知を使用する場合は、AppUserModelId が必須(UWP アプリは自動的に付与されます)。
DAC で変換したAppxの価値を高めるためにも、利用シーンに応じた拡張を考えることが重要になってくることでしょう。