目次
参画した案件で実際に使用してみて詰まった点とかを短くまとめます。
MSIXとは?
あらゆるWindowsアプリをWindowsStoreアプリにしてしまうというもの。WPFなどのデクストップアプリをUWP化することで下記の恩恵を受けることが出来ます。
- Windowsストアもしくは独自の配布プラットフォームでアプリを配布できる
- 自動アップデート機能
- UWPのAPIにアクセスできる
開発者向けのMSIXに関する記事は「アプリ インストーラーで Windows 10 アプリをインストールする」の公式リファレンスで確認できます。
インストーラーの作成方法
ソリューションに「Windows アプリケーション パッケージ プロジェクト」を追加し、そのプロジェクトの参照にWPFアプリを追加するだけ。簡単ですね!
[公式リンク](Visual Studio で MSIX パッケージ化するためのデスクトップ アプリケーションの設定)
インストーラーの作成方法ですが、「Windows アプリケーション パッケージ プロジェクト」を右クリック⇒公開⇒アプリパッケージの作成でインストーラーが生成できます。
[公式リンク](Visual Studio を使ったアプリ インストーラー ファイルの作成)
インストーラーの配布方法
このままWindowsStoreで配布することができますが、社内や特定のクライアントにのみアプリを配布したい場合は独自の配布プラットフォームを用意する必要があります。公式リファレンスだと3つのプラットフォームで配布する方法が載っています。
- Azure Web サービス
- ISSサーバ
- Amazon Simple Storage Serviceに
参画した案件では「Azure Web アプリからの Windows 10 アプリの配布」で実装しました。たぶん、同じMicrosoft系列のサービスで開発するのが一番無難だと思います。ちなみに、AmazonのストレージサービスでできるならGCPのストレージサービスで出来ると思いましたが無理でした。
UWPのAPIにアクセスする方法
Microsoft.Windows.Sdk.ContractsパッケージをインストールすることでWPFからUWPのAPIにアクセスできるようになります。MSIXを使ったアプリ開発では必須のパッケージです。
詰まった点
実務でWPFをUWP化した際に詰まった点をまとめます。
勝手に物理ストレージのファイルパスを変えられる
デクストップアプリはUWPアプリと比較して自由にファイルにアクセスできますが、当然WPFをUWP化してしまうとUWPと同じ制限がかかります。[公式リンク](ファイル アクセス許可)
UWPアプリだとアクセスできないパスを指定している場合、なんと勝手にファイルパスをUWPのアクセス領域に変えられてしまいます!当然、アプリは問題なく動いてしまうので、後になって問題が浮上…設計の修正で工数を取られました。
AppConfigurationManagerは使えない
WPFのライブラリがそのまま使える点がメリット上げられますが一部使えないライブラリがあるようでAppConfigurationManagerがその1つでした。設定ファイルはUWPのAPIに標準に搭載されているので、Microsoft.Windows.Sdk.Contractsを使って実装して下さい。
アプリ配布プラットフォーム経由でインストールした場合で挙動が変わる
本気で困った。開発機では問題なく動作するのに、いざ本番機で動かそうとするとフリーズ。ログには何も残っていない。問題は上記のAppConfigurationManagerだった「お前開発機だと動いたじゃん!!!」と嘆いた。アプリの動作ログを出力させてたので比較的早期に解決できたのが幸い。ライブラリの技術調査ではアプリ配布プラットフォーム経由でアプリをインストールして動作確認して下さい。
証明書のインストールはルート証明機関
地味に詰まったのが証明書のインストール。.cerファイルをダブルクリックすると証明書をインポートできるのですが、ローカルコンピュータ⇒信頼されたルート証明機関を選択する必要があるようです。
設計パターン
せっかくなのでデクストップアプリとWindowsアプリを両方リリースできる設計で開発を進めましょう。下記の設計パターンが考えられます。
- WPF用の処理をvirtual修飾子で作成して、UWP用の処理でoverrideしてに上書き
- StrategyパターンでWPFとUWPを切り替えられる設計にする リンク⇒Strategyパターンの解説
UWP vs WPF + MSIX
個人的見解を述べます。
WPFをUWP化した際の問題
デクストップアプリをUWP化するとアプリの挙動が変わるので厄介です。さらにインストーラー経由でアプリをインストールすると、また挙動が変わるので非常にややこしいです。「アプリの自動アップデートが欲しいからUWPで作る必要があるけど、UWPよりもWPFのほうが制限がなくて楽そうだからこれで開発してくれ」で開発を引き受けたけど、挙動が2段階も変わるせいで面倒です。
ライブラリや情報はUWPよりもWPFのほうが多いけど…
WPFのほうが対応しているライブラリが多いからWIndowsアプリをWPF+MSIXで開発するメリットがありますが、インストーラー経由でアプリをインストールして、アプリがそのライブラリにアクセスしてフリーズしないことを確認しないと問題なく使えるかどうか判断できない状態なので、なんとも言えないです。特に物理ストレージにアクセスするタイプのライブラリは動作確認して下さい。
また、UWPよりもWPF向けの情報がネットで多く見つかりますが、WPF+MSIXの記事は少ないので、この辺で詰むと解決に時間がかかります。
組込データベースが必要な場合
調べてる感じでは組込データベースのライブラリはEntityFrameworkCoreもしくはSQLite-net (sqlite-net-pcl)の2種類。WPF+MSIXであればEntityFrameworkCoreの最新版で作ることができます。それ以外のプラットフォームでは古いバージョンしかつかえず既出の問題もいくつかあるので、UWP、Unity、XamarinなどではSQLite-net (sqlite-net-pcl)で開発したほうがいいかも。ちなみに有料でも良いならRealmも候補に挙がりそうです。