UWPアプリをコマンドラインから起動できるようにする
![バッチファイルから起動したサンプルアプリ](https://codezine.jp/static/images/article/11325/fig10s.png)
コンソール(右下)には「8」という終了コードが表示されている
- コンソールやバッチファイルからUWPアプリを起動できます
- コマンドライン引数を渡せます。終了コードも返せます
- Windows 10 version 1709(build 16299)から利用可能
マニフェストにwindows.appExecutionAlias拡張宣言を追加すると、コマンドラインからUWPアプリを起動できるようになります。
マニフェストの変更
コマンドラインから起動できるUWPアプリにするには、マニフェストに拡張宣言が必要です。
ソリューションエクスプローラーでPackage.appxmanifestを右クリックし、[コードの表示]を選んで、マニフェストを直接編集します。
まず、先頭のPackage
タグに名前空間「uap5」を追加します。自動起動と同じですので、実際のコードは2ページ目を参照してください。
次に、uap:VisualElements
要素の後ろに、次のコードのようにExtensions要素を追加します。
<Applications> <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="UF12.App"> <uap:VisualElements DisplayName="UF12" ……省略……> ……省略…… </uap:VisualElements> <Extensions> <uap5:Extension Category="windows.appExecutionAlias" Executable="UF12.exe" EntryPoint="UF12.App"> <uap5:AppExecutionAlias> <uap5:ExecutionAlias Alias="UF12.exe"/> <uap5:ExecutionAlias Alias="UF12AnotherAlias.exe"/> </uap5:AppExecutionAlias> </uap5:Extension> </Extensions> </Application> </Applications>
設定する値は、次のようになります。
- Executable:実行ファイル名(アセンブリ名+「.exe」)
- EntryPoint:エントリーポイント(通常はアセンブリ名+「.App」)
- ExecutionAlias:コマンドラインから起動するときに使う名前(通常は実行ファイル名)
ExecutionAliasは、上の例のように複数指定できます。拡張子「.exe」は必須です。コマンドラインからは、どの名前でも起動できます。上の画像のバッチファイルの中では、「UF12AnotherAlias」の方で起動しています。
コマンドラインから起動されたときの処理
マニフェストに指定しただけでは、アプリは起動しません。自動起動の場合と同じく、通常のOnLaunchedメソッド(Appクラス)ではなく、OnActivatedメソッドが呼び出されるからです。OnActivatedメソッドは、次のコードのように記述します。
protected override void OnActivated(IActivatedEventArgs args) { Frame rootFrame = Window.Current.Content as Frame; if (rootFrame == null) { rootFrame = new Frame(); Window.Current.Content = rootFrame; } string payload = string.Empty; // 最初の画面に渡すパラメーター if (args.Kind == ActivationKind.CommandLineLaunch) { // コマンドラインから起動された var startupArgs = args as CommandLineActivatedEventArgs; var operation = startupArgs.Operation; // 起動ディレクトリ string activationPath = operation.CurrentDirectoryPath; // コマンライン引数 payload = operation.Arguments; // コマンドラインから起動された時に行う処理があればここに // 終了コードを設定する例 operation.ExitCode = payload.Length; } rootFrame.Navigate(typeof(MainPage), payload); Window.Current.Activate(); }
このOnActivatedメソッドを抜けると、コマンドライン側に制御が戻ります。終了コードをコマンドライン側に返したいときは、OnActivatedメソッドを抜ける前にExitCodeプロパティに設定します。
なお、CurrentDirectoryPathで起動ディレクトリを取得できますが、通常はアプリからそのディレクトリ内のファイルにアクセスできません。サイドローディングで配布する業務アプリなら、ファイルの「フルアクセス機能」を使えばアクセスできます。