Windows 10 on ARM 用 アプリ を Windows 10 on ARM 上の Visual Studio 2019 (x86) でビルドする

## なぜ、こんなことをするのか？
「__セルフコンパイル（ローカルビルド）は◯◯◯のロマンだから！__」

というように、出だしから変なテンションで申し訳ありません。

自分は ASUS NovaGo (Spec: Snapdragon 835, 6GB RAM, 128GB Storage) という Windows 10 on ARM な OS を採用するちょっと変わったマシンを所有しています。

お気に入りのマシンなのですが、Windows 10 on ARM については Microsoft 自身が Surface Pro X を出したとはいえまだまだネイティブアプリが寂しい状況と言えます。
開発ツールなんかも限られていて、皆さん基本的にはクロスコンパイルで作業していると思われます。
ただ、ご存知かはわかりませんが、この Windows 10 on ARM は通称 WoA (Windows on Arm) というエミュレーションによりパフォーマンスは落ちるものの x86 (32bit) アプリが動きますので、普段使いには向かないことは重々承知の上で Microsoft 謹製の開発ツールである Visual Studio 2019 community (x86) を Windows 10 on ARM 上で試してみました。

## 情報収集
現状 Windows 10 on ARM のアプリ開発について、情報はこれまた寂しい限りですが、以下のしばやんさんのブログが色々と参考になりました。

[しばやん雑記](https://blog.shibayan.jp/)
　・ [Surface Pro X (ARM64) に対応したアプリケーションを作る](https://blog.shibayan.jp/entry/20191004/1570123993)
　・ [Vcpkg と CMake を使って Windows 10 ARM64 向けクロスコンパイルを行う](https://blog.shibayan.jp/entry/20191202/1575222083)
　・ [Electron で Surface Pro X にネイティブ対応したアプリを作る](https://blog.shibayan.jp/entry/20200504/1588525112)

ここに感謝の意を表します。

その他、Microsoftの公式ドキュメントはこちらになります。
[ARM 版 Windows 10 のドキュメント](https://docs.microsoft.com/ja-jp/windows/arm/)

## セットアップ
まあ現時点で Windows 10 on ARM なんてものを所有している方であれば Visual Studio のセットアップなんて今更説明の必要はないと思いますが、一応自分のセットアップのポイントを言えば C/C++ (Win32) を主軸に置いているので、「C++ によるデスクトップ開発」にチェックを入れて、個別のコンポーネントタブから「ARM64 ビルドツール」関係と「CMake」および「Git for Windows」を入れておきました。
![VS2019_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680157/dc136a3f-697d-b3bf-82f0-e01a10529ab0.png)
　※ CMake や Git for Windows はお好みで「Visual Studio Installer」を使用せずに個別インストールでも良いかと思います。
　※ Node.js 関係は Electron のお試し用です。

## サンプルビルド
まず第一印象、やはり NovaGo にこの IDE は重たすぎる…

とはいえ、これはただの趣味でありロマンなのでここは気にしないのです！
また、今後ネイティブな開発ツールを揃えていくために bootstrap 的な役割も担うはずで、曲がりなりにも Visual Studio が動くということは大切なことなのです！

とりあえずサンプルとして「新しいプロジェクトの作成」から「Windows デスクトップアプリケーション」を選んで始めます。
「構成マネージャー」で「ARM64」を追加してビルドすればまずは ARM64 ネイティブアプリの出来上がりです。

ただ制限として、ARM64 アプリについては IDE の統合ローカルデバッガは使用できません。 まあ、しょうがないですね…
一応、代替え手段としては Visual Studio のセットアップ時にインストールされた WindowsSDK の変更セットアップから「Debugging Tools for Windows」を追加すればスタンドアロンのデバッガが使用できます。
![VS2019_02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680157/9b69a775-735c-ffae-0c00-4bef80685f34.png)
![VS2019_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680157/ff3f2fee-88d6-9765-ca69-c7a9f626682b.png)
![VS2019_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680157/7aa7e750-e773-3e7d-097f-a2f7dfdac5f9.png)
![VS2019_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680157/ac49152c-4625-5ea6-50b4-1156e1b62d00.png)

あと、ひとつ問題があって、デフォルトではダイナミックリンクでビルドされるのですが、ビルドされたアプリを起動しようとすると「コンピューターに VCRUNTIME140.dll  がないため、プログラムを開始できません」とエラーメッセージが出て起動できません…
これについてはこちらの「[最新のサポートされる Visual C++ のダウンロード](https://support.microsoft.com/ja-jp/help/2977003/the-latest-supported-visual-c-downloads)」から ARM64 用 VC 再頒布可能パッケージをダウンロードしてインストールすれば解決はできるのですが、VCRUNTIME140.dll って ARM64 がサポートされていなかった頃（Visual Studio 2015）の Runtime ですよねぇ？ 32bitARM が関係するのかなぁ？？ 解せぬ…
ちなみに、スタティックリンクでは問題ないです。

## おわりに
以上、とりとめのない初投稿であり、やってることは「 __セルフコンパイル__ じゃなくて __セルフクロスコンパイル（謎語）__ だろっ！」というお叱りも受けそうですが、Windows 10 on ARM に興味を持つお仲間が一人でも増えるといいなと思い筆を執ってみました。
誰かの何かの参考になれば幸いです。

## 追加備忘録
当たり前ですが、ダイナミックリンクで Debug ビルドしたものを起動する時には Debug 用の Runtime を要求されます。
[こちらの記事](https://qiita.com/qinyong/items/4f88a5e019871f1033a1) を参考に探したところ、自分の環境では
　・ `C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Redist\MSVC\14.26.28720\debug_nonredist\arm64\Microsoft.VC142.DebugCRT`
および
　・ `C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\arm64\ucrt`
にありましたので、とりあえず Path を追加して凌いでます。
![SystemPath_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680157/800fb759-bee4-aa2c-0823-135368e54998.png)