[C# Avalonia] 3D Model Explorer #03 — Mac版を公開。Linux版を1行変え移植完了。

[C# Avalonia] 3D Model Explorer #03 — Mac版を公開。Linux版を1行変え移植完了。

はじめに

VRM / PMX / FBX / GLB ファイルをサムネイル一覧で管理するデスクトップアプリ「3D Model Explorer」の Mac版を公開しました。

Windows版、Linux版に続いて3つ目のプラットフォーム対応。

ただ、今回の「移植」は、正直に言って衝撃的な体験でした。

実質的なコード変更は、ウィンドウタイトルの1行だけ。

Title="3D Model Explorer (Linux)"

Title="3D Model Explorer (Mac)"

嘘みたいですが、本当にこれだけで Mac 上で完全に動作するアプリが完成。

[C# Avalonia] 3D Model Explorer #03 — Mac版を公開。Linux版を1行変え移植完了。

やったこと

今回の作業を時系列で並べると、こうなります。

  1. MacBook Air(2020 / Intel i7)にSSHでリモート接続できるようにした
  2. VS Code の Remote-SSH で Windows から Mac に接続
  3. GitHub から Linux版のリポジトリをクローン
  4. Homebrew で .NET 8 SDK をインストール
  5. dotnet run を実行した
  6. 何も変更していないのに、そのまま動いた
  7. タイトルを「(Mac)」に変更
  8. dotnet publish でリリースビルド
  9. BOOTH にアップロード

環境構築を含めて、所要時間は約1時間。そのうちコードを触った時間は、タイトルを書き換えた数秒間だけです。

なぜこんなことが可能なのか —— Avalonia UI

これを可能にしたのは、Avalonia UI というフレームワークです。

Avalonia UI とは

Avalonia は、.NET のオープンソース UI フレームワークです。ひとことで言えば「WPF(Windows Presentation Foundation)のクロスプラットフォーム版」です。

WPF は Windows 専用の GUI フレームワークで、XAML と C# を使ってデスクトップアプリを作る仕組みです。非常に強力ですが、Windows でしか動きません。

Avalonia は、この WPF の設計思想と XAML 記法をほぼそのまま引き継ぎつつ、Windows / Linux / macOS / iOS / Android / WebAssembly で動作するように作られています。WPF を作った元 Microsoft のエンジニアが関わっているため、XAML の書き方がとても似ており、WPF の知識がほぼそのまま使えます。

有名な採用事例としては、JetBrains の Rider(.NET 向け IDE)が Avalonia で構築されています。

WPF → Avalonia → 3プラットフォーム対応の流れ

3D Model Explorer のこれまでの開発経緯は、こうなっています。

  • v1.0(Windows版): C# + WPF で開発。約5時間で完成
  • v1.1(Windows版): GLB対応、ダークテーマ、設定エクスポート等を追加
  • Linux版: WPF → Avalonia UI に移植。約2時間で全機能移植完了
  • Mac版: Linux版のコードをそのまま使用。タイトル変更のみ。約1時間(環境構築含む)

ポイントは、Linux 移植のタイミングで WPF 依存をすべて Avalonia に置き換えたことです。このとき行った主な変更は以下の通りです。

  • XAML 名前空間の変更
  • BitmapImageAvalonia.Media.Imaging.Bitmap
  • MouseLeftButtonUpPointerPressed
  • StatusBarBorder + DockPanel
  • ファイルダイアログ → StorageProvider API
  • 設定パス: %APPDATA%~/.config/

一方で、このアプリの核心であるバイナリパース処理(GLBからのサムネイル抽出、VRMメタデータ解析、PMXヘッダー解析など)は 1行も書き直していません。C# の BinaryReaderbyte[] 操作はプラットフォームに依存しないため、Windows で書いたコードがそのまま Linux でも Mac でも動きます。

つまり、Linux 移植のときに「Avalonia 化」という作業を1回やれば、それ以降は ビルドターゲットを変えるだけ で新しいプラットフォームに対応できるということです。

.NET の実力

.NET(というより C# + .NET ランタイム)は、Web 開発やスタートアップの文脈では「人気がない」と言われることがあります。実際、人気ランキングで上位に来るのは JavaScript / Python / Go あたりでしょう。

ですが、「人気がない」と「使えない」はまったく別の話です。

今回の体験で実感したのは以下の点です。

  • クロスプラットフォームが本当に動く: Java の「Write Once, Run Anywhere」と同じ思想が、.NET でもちゃんと実現されている
  • ネイティブに近いパフォーマンス: self-contained ビルドで .NET ランタイムごと1つの実行ファイルにまとめられる。ユーザーは SDK のインストール不要
  • バイナリ操作が強い: BinaryReaderSpan<byte>MemoryStream など、バイト列を扱うための道具が充実している。GLB や PMX のようなバイナリフォーマットの解析には最適
  • 既存資産が活きる: 1年以上の Web 開発(Three.js / WebXR)で蓄積した GLB / VRM / PMX のバイナリ知識を、C# にそのまま移植できた

ネットの評判と実体験

ネットで技術の評判を調べると、「.NET は人気がない」「Avalonia はマイナー」といった声が目に入ります。私自身、開発を始める前は半信半疑でした。

でも、実際に手を動かしてみると、世界が違いました。

WPF のアプリを2時間で Linux に移植し、さらに1時間で Mac 版を出せた。バイナリパースのロジックは3プラットフォームで1行も変わっていない。この体験は、どんなブログ記事やランキングよりも説得力があります。

噂話で知るのと、自分で手を動かして開発して体験するのは、全く別次元の話です。技術選定は人気ランキングではなく、自分のやりたいことに合っているかどうかで決めるべきだと、改めて思いました。

まとめ

  • 3D Model Explorer の Mac 版を公開しました
  • Linux版のコードからタイトル1行変えただけで動きました
  • Avalonia UI + .NET 8 のクロスプラットフォーム対応は本物でした
  • ダウンロードはこちら:

NOTE記事: