rksoftware

Visual Studio とか C# とかが好きです

Uno Platform アプリを Mac と 上の VM 上の Windows で作りたい

Uno Platform は Android と iOS と UWP と Wasm のアプリを作れる夢のプラットフォームです。
そしてどんなクロスプラットフォーム開発でもそうであるように、実際の開発では一つの環境で全てのデバッグを行うことは困難です。

※ Windows から Mac へ接続してのリモートデバッグは可能ですが、フリー WiFi やコワーキングスペース、ゲストネットワークの環境ではあまりやりたくありません。

対象プラットフォームとデバッグできるプラットフォーム

対応プラットフォームの組み合わせは次になります。

Android iOS UWP Wasm
macOS ×
Windows ×

※ Visual Studio Code で Wasm を Windows、Linux、macOS で作れるとされていますが、今回は Mac = Visual Studio for Mac を使用する前提とします。 Visual Studio Code が対応しているのが Wasm だけということで、iOS が対象外なので。

■ VM で Windows を動かしている Mac 一台で開発したい!

しかし私はわがままなので、一台のノートブックで全てのプラットフォームをカバーしたいと考えています。
そこで必死に考えました。その結論です。

  1. Mac 上に VM を立て Windows を動かす (普段使いの環境)
  2. Mac と VM 上の Windows の共有ディレクトリにソースコードを置く
  3. そのソースコードを両方の OS から参照してデバッグする

これで行けるはず完璧な計画です。

■ 落とし穴

しかし、この作戦には一つ落とし穴がありました。
共有ディレクトリに置いた UWP プロジェクト (ソリューションではなく) を Windows に配置できません。しようとすると次のエラーが出ます。

重大度レベル   コード   説明  プロジェクト  ファイル    行 抑制状態
エラー       DEP0700: アプリケーションの登録に失敗しました。[0x80073D1F]  App1

デバッグ実行しようとしていた場合は、メッセージボックスも出ます。

配置エラーが発生しました。

使っている VM ソフトにもよると思いますが、共有ディレクトリが外部ディスク扱いされ、UWP の配置ができませんでした。

■ ソリューションの位置と UWP プロジェクトの関係

UWP をデバッグするために必要な条件は プロジェクトが内蔵ディスクにあることで、ソリューションがどこにあるかは関係ないようです。

↓ソリューション | プロジェクト→ 内部 外部
内部 ×
外部 ×

■ 解決策

  1. ソシューションは共有ディレクトリと Windows 内の両方に作る
  2. UWP プロジェクトは Windows 側に置く
  3. その他のプロジェクトは共有ディレクトリに置く

とし、OS 毎に別のソリューションで開発すれば、ソリューションは別になってしまうもののプログラムソースは共有できます。

手順

  1. Windows の Visual Studio から共有ディレクトリに Uno Platform プロジェクト (ソリューション) を新規作成する
  2. Mac ではそのソリューションをそのまま使う
  3. Windows に空のソリューションを作る
  4. UWP プロジェクトを Windows 上の空のソリューションにコピー
  5. Windows 側でコピーしてきた UWP プロジェクトを 追加 > 既存のプロジェクト で追加
  6. その他のプロジェクトも 追加 > 既存のプロジェクト で追加
  7. Windows では、Windows 上のソリューションを使う

ファイルの位置としてはこれで出来上がりです。

■ 落とし穴

しかし、この作戦には一つ落とし穴がありました。
なんと、プロジェクトの参照の追加の共有プロジェクトの欄に 追加 > 既存のプロジェクト で追加した <ソリューション名>.Shared が選択肢に出てきません。UWP プロジェクト以外は .csproj に正しい相対位置が入っているので動作しますが、UWP はコピーしたため位置が変わっているので何とかしなくてはなりません。

対策

UWP プロジェクトの .csproj を手編集します、簡単ですね。

  1. UWP プロジェクトの .csproj ファイルをテキストエディタなどで開きます
  2. <Import Project="..\<プロジェクト名>.Shared\<プロジェクト名>.Shared.projitems" Label="Shared" Condition="Exists('..\<プロジェクト名>.Shared\<プロジェクト名>.Shared.projitems')" /> の部分をドライブ名まで含めた、共有プロジェクトの絶対パスに書き換えます

■ 簡単ですね

本当は、常にプライベートなネットワークにいてリモートデバッグすれば一番いいのですが、私のワークスタイルだと個人の活動でそれは難しく色々と策を弄することになりました。生きるのは困難ばかりです。

生きるのは困難ばかりです。

しかしなんとかそれなりに扱いやすいプラットフォーム対応の環境が手に入りました。
簡単ですね。