かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Desktop Bridge のアプリで UWP から同じパッケージ内の exe を起動する方法

表題の通りです。 UWP だけではできないことは DesktopBridge を使うことで実現できることもあるというわけなのでやってみましょう。

プロジェクトの作成

以下の 3 つのプロジェクトを作成します。

  • Windows アプリケーション パッケージ プロジェクト
    • 名前は任意ですが、ここでは LaunchApp という名前で作りました。
    • UWP がサポートするプラットフォームは、とりあえず最小もターゲットも Fall Creators Update にしました。(ここは私の好みなので、自分がサポートしたいバージョンに合わせましょう)
  • 空白のアプリ(ユニバーサル)を追加
    • 名前は任意ですが、ここでは LaunchApp.UWP という名前で作りました。
    • 最小とターゲットは Fall Creators Update(自分のサポートしたいターゲットに合わせて大丈夫です)
  • WPF アプリ(.NET Framework)を追加
    • 名前は任意ですが、ここでは LaunchApp.WPF という名前で作りました。

プロジェクトの設定

LaunchApp プロジェクトのアプリケーションの右クリックメニューから参照の追加で、LaunchApp.UWP と LaunchApp.WPF を追加します。

アプリケーションの下に追加された LaunchApp.UWP を右クリックしてエントリ ポイントとして設定します。

こんな感じになります。

f:id:okazuki:20180209202031p:plain

マニフェストへの exe の登録

LaunchApp プロジェクトの Package.appxmanifest を右クリックしてコードの表示をします。

Package タグに以下の xml 名前空間を追加します。

xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"

そして、Application タグの下に Extensions タグを以下のように追加します。

<Extensions>
  <desktop:Extension Category="windows.fullTrustProcess"
                     Executable="LaunchApp.WPF\LaunchApp.WPF.exe" />
</Extensions>

ここに登録した exe が起動できます。注意点は1つしか登録できないところですかね。(多分)

UWP から exe の起動

ついに起動処理を書きます!といっても大したことはないですが。 まず、FullTrustProcessLauncher クラスを使うのですが、これはデスクトップデバイスファミリーのみで使えるので参照に追加します。

参照の追加で Universal Windows → 拡張 の中にある Windows Desktop Extensions for the UWP にチェックを入れます。バージョンが複数ありますが 14393 以上に入っています。

exe を起動するきっかけのボタンを MainPage.xaml に置きます。

<Page x:Class="LaunchApp.UWP.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="using:LaunchApp.UWP"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Button Content="Launch"
                Click="Button_Click" />
    </Grid>
</Page>

MainPage.xaml.cs で以下のコードを書きます。

using System;
using Windows.ApplicationModel;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace LaunchApp.UWP
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
        }
    }
}

FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync() で先ほど定義した Extension の exe が起動します。

実行して動作確認

こんな感じに動けば完成です。(Any CPU じゃなくて x86 とか x64 にして起動するのを忘れずに)

f:id:okazuki:20180209203524g:plain

つづき

起動が出来たら次は連携になります。連携についてはこちらの記事をご確認ください。

blog.okazuki.jp