UWP(Uno Platform)から同じパッケージ内の exe(WPF) を起動

ほぼ 下記Blog通り↓。少しだけ変更している。

Desktop Bridge のアプリで UWP から同じパッケージ内の exe を起動する方法@かずきのBlog https://blog.okazuki.jp/entry/2018/02/09/204909

変更部分

  • パッケージプロジェクトは作成しないようにした。
  • UWPは、Uno Platformで作成
  • WPFは、.Net Core3.1

※ Uno使っているけどUWP+WPFなのでWindows専用

Uno Platformでプロジェクト作成

f:id:kawaishi2:20201019152953p:plain

Shared と UWP 以外は使わないのでアンロード

f:id:kawaishi2:20201019153016p:plain

WPFアプリ追加

ソリューション選択 > 追加 > 新しいプロジェクト

f:id:kawaishi2:20201019153032p:plain

WPFアプリを追加。(.Net Core)

f:id:kawaishi2:20201019153050p:plain

UnoUwpWpf.Wpf4Uwp という名前でWpfプロジェクトを追加した。(重複しまくり)

f:id:kawaishi2:20201019153101p:plain

WPF側:アプリの単一化(オプション)

パッケージプロジェクトを作成しないので、UWPアプリが見える箇所にWPFアプリファイルを渡してやる。

その際、ファイルが1個だと便利かな? と思っていれた。

f:id:kawaishi2:20201019153134p:plain

f:id:kawaishi2:20201019153149p:plain

  • プロファイル設定で「単一ファイルの作成」をチェック
  • 一応「自己完結」モードに。(単一ファイルの時は自動で自己完結になるっぽいけど、一応)
  • ReadyToRunとトリミングはわからん。なんかファイルサイズが小さくなりそう?

f:id:kawaishi2:20201019153205p:plain

とりあえず1回 発行しておく。

f:id:kawaishi2:20201019153216p:plain

できた。

f:id:kawaishi2:20201019153229p:plain

UWP側:WPFファイルのコピー

さっき作成したexeファイルを、UWPのプロジェクト直下にコピーする。

UWPプロジェクト>プロパティ>ビルドイベント>ビルド前の編集

f:id:kawaishi2:20201019153300p:plain

WPFのexe を、UWPのプロジェクトにコピー

f:id:kawaishi2:20201019153310p:plain

※ 単一化してない場合は、フォルダごとコピーとかかも。

UWP側:WPFファイルをUWPの出力に含める

とりあえず1回ビルド(↑のコピーイベントを実施)

Wpf(exe)がUWPプロジェクトの直下にコピーされる。

コピーされたファイルをUWPプロジェクトに追加。

f:id:kawaishi2:20201019153328p:plain

追加したWPFファイルのプロパティを開いて、「常にコピー」か「新しい場合はコピー」に出力設定を変更。

f:id:kawaishi2:20201019153338p:plain

f:id:kawaishi2:20201019153349p:plain

UWP側:Package.appxmanifest の編集

runFullTrust を追加。

Executable は相対パスだと思う。

単一化していない(フォルダをコピーしている)場合や、デバッグ設定によってはズレてくるかも。

ズレていれば、ビルドのときに「そのexe無くない?」ってエラーにしてくれる。親切。

f:id:kawaishi2:20201019153403p:plain

=== ここから先は、ほぼ かずきさんのBlog通り ===

UWP側:SDK参照

Windows Desktop Extensions for the UWP にチェックし、追加。

f:id:kawaishi2:20201019153416p:plain

UWP側:ボタン押したらWPF起動するようコーディング

Shared プロジェクトのMainPage.xaml.cs

    <Grid>
        <Button
            Margin="20"
            Click="BtnClick"
            Content="Launch Wpf"
            FontSize="30" />
    </Grid>


Shared プロジェクトのMainPage.cs

        private async void BtnClick(object sender, RoutedEventArgs e)
        {
#if WINDOWS_UWP
            await Windows.ApplicationModel.FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();
#endif
        }

UWP側:起動

起動してボタン押せばWPFが起動する。

f:id:kawaishi2:20201019153429p:plain

おわり