.NET MAUI の Linux 対応の進捗について


[.NET MAUI Advent Calendar 2024](https://qiita.com/advent-calendar/2024/dotnetmaui) 3日目の記事です。

## はじめに

この資料を読んでいる人は .NET MAUI の利用者、または利用を検討している方が多いと思います。.NET MAUI には数多くの利点があり、特に C# だけでクロスプラットフォーム対応の GUI アプリケーションを比較的簡単に作ることができるという点が魅力的であると思います。

現在は、Windows, macOS, Android, iOS, Web (MAUI Blazor Hybrid Web App のみ) に正式対応し、安定度の向上、コントロールの追加など徐々に開発が進行しています。

さて、本題ですが .NET MAUI は Linux は対応しているのでしょうか?

調べてみると、いくつかの記事では "Linux 対応" と、別の記事では "Linux 対応の望みはない" と真逆の説明が見られます。実際にはどの情報が正確なのでしょうか、また動かすことはできるのでしょうか。

### TL;DR;

最初に結論を述べますが、Linux 向けのアプリケーションを既存のコードでビルドすることは**ほぼ不可能**です。

コードの変更や、依存関係などをいろいろ頑張るとなんとか動かなくもないです。[^youtube-maui-on-linux]しかし、かなりの手間がかかり、安定度も低く、実装されていない点もいくつかあるため、現時点では推奨しません。

[^youtube-maui-on-linux]: サンプルコードは動かせますが、.NET MAUI の利点である、Windows, macOS, Android, iOS との同一コードにはおそらくできません。(https://www.youtube.com/watch?v=s-clGkUbk84)

(同一コードではなく、サンプルのコードなら動かしている例があります。しかし、現時点では実用的な段階ではありません[^youtube-maui-liunx])

[^youtube-maui-liunx]: https://www.youtube.com/watch?v=s-clGkUbk84

.NET 8 の時点では .NET 9 か 10 までにある程度使えるようになったらいいな…と言われていましたが、.NET 9 には全く間に合いませんでした。早くて .NET 10[^net10][^net10-2]、もしくはそれ以降になると思われます。

[^net10]: https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$xcsGDT9pWQyi4x33fHi0FSWxLgXt_7OTT9LFducXtdM?via=matrix.org&via=krutonium.ca
[^net10-2]: https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$gg-A3LcjyKyhvH0v3v06-I-PyfoDsCb4oGU9A0PIFLk?via=matrix.c3s.cc&via=matrix.org&via=krutonium.ca

現状開発[^maui-linux-repo]が停滞しており (現在の最終 Commit が約7ヶ月前)、使えるようになる目処は立っていません。

[^maui-linux-repo]: https://github.com/jsuarezruiz/maui-linux

なお、Linux 上で VSCode を使い、Android 向けのアプリケーションを作ることは可能です[^maui-on-linux]。

[^maui-on-linux]: https://techcommunity.microsoft.com/blog/educatordeveloperblog/-net-maui-on-linux-with-visual-studio-code/3982195

(※以降、本資料での "Linux 対応" は Linux 向けのアプリケーションが作成可能かどうか、という話が中心となります。Linux から他のプラットフォームへの出力の話は後半で少しだけ記載します)

## 歴史

.NET MAUI の Linux 対応に関しては、MAUI のそもそもの歴史をたどる必要があります。

### Xamarin vs .NET MAUI

.NET MAUI は、Xamarin というフレームワークの後継として開発されました。

突然ですが、以下の表をご覧ください。

|  | **Xamarin Forms** | **.NET MAUI** |
| - | - | - |
| **Platforms** |  |  |
| Android | API 19+ | API 21+ |
| iOS | 9-14 | 10+ |
| Linux | Community | Community |
| macOS | Community | Microsoft |
| Tizen | Samsung | Samsung |
| Windows | UWP Microsoft<br />WPF Community | Microsoft |

(引用: https://forest.watch.impress.co.jp/img/wf/docs/1254/643/html/image5.jpg.html)

この表は、Xamarin と .NET MAUI のサポート対象について示したものです。

こちらの表を見てわかるように、macOS は Xamarin から .NET MAUI になる際に Microsoft が公式サポートするようになりました。しかし、Linux はコミュニティーの開発のまま変化しませんでした。

この理由は、おそらく Linux のシェア率の低さに起因していると考えられます。デスクトップ OS の中でも世界的シェア率が1-2%程度に留まっているため、開発の優先度が低いと考えたのではないかと私は考えます。

### 現状

現在では Linux もかなりシェア率を伸ばし、特に開発者の中ではその重要度が高まってきています[^developer-with-linux][^dev2]。日本は Linux のシェア率が低いですが、世界的には普及率が高くなってきています[^linux-in-local-area]。(おそらく Steam Deck の影響です)

[^developer-with-linux]: https://github.com/dotnet/maui/discussions/339#discussioncomment-7581164 (1/3に近い開発者が Linux/Unix を利用しています (何故かパーセントの合計が100%を越していますが、重複ありなのでしょうか…?))
[^dev2]: https://github.com/dotnet/maui/discussions/339#discussioncomment-345663
[^linux-in-local-area]: https://www.reddit.com/r/linuxmasterrace/comments/1ax0sh3/i_created_a_map_of_the_linux_market_share/

また、.NET MAUI コミュニティーでも Microsoft による Linux 対応を望む声が多く存在します[^discuss-linux]。

[^discuss-linux]: https://github.com/dotnet/maui/discussions/339

しかし、"現在サポートしているプラットフォームの安定度を上げることに注力する"という理由を元に、Linux の公式サポートの提案を棄却しています[^about-linux-support]。(この発言が大々的に公表されていないので、多くのコミュニティーの人々が不満を持っているのですが)

[^about-linux-support]: https://github.com/dotnet/maui/issues/11738#issuecomment-1732013969

### 部分的に導入されている箇所

とはいえ、Linux 向けの実装が全く .NET MAUI のリポジトリに追加されていない、というわけではなく、実はグラフィックの実装だけはすでに完成しています[^maui-graphics]。

[^maui-graphics]: https://github.com/dotnet/maui/issues/1126#issuecomment-913582819

それが [Microsoft.Maui.Graphics](https://www.nuget.org/packages/Microsoft.Maui.Graphics/) です。

この実装に関しては .NET 6 の早期から完成しており、現在の .NET 8 でももちろん利用可能です。

(個人的に Linux 上での利用に関しては[こちらの記事](https://blog.masudaq.com/items/00ba96d8-021f-4f08-b8a0-75ea9edfce73)がわかりやすかったです)

System.Drawing が Windows 専用となった[^system-d]ことで、クロスプラットフォームでのグラフィック描画ではこちらの Microsoft.Maui.Graphics が有力な代替候補[^system-d-rec]として知られるようになりました。(名前に Maui と入っていますが、Maui でなくても利用できます)

[^system-d]: https://learn.microsoft.com/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only
[^system-d-rec]: https://learn.microsoft.com/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only#recommended-action

### 次に実装されそうな部分

これからは段階的に実装していくか、一気に実装されるかはわかりませんが、前者だと Blazor on Linux が有力だと思います。

というのも、2022年から [Issue](https://github.com/dotnet/maui/issues/11738) が立っており、(ほとんどの Linux 関連の Issue が Close されているのにも関わらず) *Milestone: Backlog* として Open されたままだからです。

とはいえ、あまり進んでいないようですが…

### 現状

.NET MAUI で Linux 向けの実装を行っている Fork は [jsuarezruiz/maui-linux](https://github.com/jsuarezruiz/maui-linux) です。主に [lytico](https://github.com/lytico) さんが開発していました。

(現在は [knocte](https://github.com/knocte) 氏と [webwarrior-ws](https://github.com/webwarrior-ws) 氏が主に開発している [nblockchain/Mali](https://github.com/nblockchain/Mali) のほうがやや活発です)

一応 https://github.com/jsuarezruiz/maui-linux/pull/66 のように動かすことはできますが、既存の MAUI 向けのコードではほぼ不可能です。

そもそも `dotnet` (コマンド) の workload である `gtk` をインストールするのが難しすぎる、という問題もあり、開発自体も困難を極めています。

(これに関しては、[Thomas Mielke](https://github.com/thomiel) 氏が Docker の作業環境を整えてくれました: [GtkSharp 用](https://github.com/Thomas-Mielke-Software/GtkSharp-Docker), [maui-linux 用](https://github.com/Thomas-Mielke-Software/maui-docker))

なぐり書きですが、私がリアルタイムで収集している maui-linux 関連の情報をまとめた Zenn scraps です。さすがにひどすぎるので参考にできないと思いますが、一応リンクを掲載しておきます: https://zenn.dev/lemon73/scraps/2449b3317077ba

機能の追加の際は、基本的に [GtkSharp](https://github.com/GtkSharp/GtkSharp) の実装に追加する必要があり、GTK の知識が必要となります。(また、現状では GTK3 をベースにしていますが、GTK4 が最新となっているため、これに移行する必要があります)

GtkSharp のメンテナーが少ないということも、Linux 対応があまり進んでいない原因の1つなのかと考えます。

## クロスコンパイル

MAUI は Linux に正式対応しておらず、他のフレームワークやライブラリと比較してクロスプラットフォームの対応が弱いです。

それだけでなく、実はクロスコンパイルもややイマイチです。

以下の表をご覧ください。

| TFM | Windows | macOS | Linux |
| --- | --- | --- | --- |
| net8.0-android | :white_check_mark: | :white_check_mark: | :white_check_mark:[^build-1] |
| net8.0-ios | ⚠️[^build-2] | :white_check_mark: | :x: |
| net8.0-maccatalyst | ⚠️[^build-2] | :white_check_mark: | :x: |
| net8.0-windows | :white_check_mark: | :x: | :x: |

(引用: https://zenn.dev/proudust/articles/2022-12-06-build-maui-on-gh-actions#tfm-とビルドまたは発行可能な-os)

[^build-1]: `.csproj` ファイルの変更が必要
[^build-2]: ビルドは可能、発行はエラー

この表はクロスコンパイルについて示しています。(データは .NET 7 時代のものですが、おそらく .NET 9 となった今でも変わっていません)

わかりやすくまとめると、

- Windows -> Windows, Android (macOS, iOS はビルドのみ)
- macOS -> macOS, iOS, Android
- Linux -> Android

となります。

Windows から macOS や iOS 向けの発行はできません (ビルドは可能)。また、CI/CD で利用されることの多い Linux から発行できるのは Android 向けのみです。(WPF では Linux から Windows 向けを発行できますが[^wpf-linux])

[^wpf-linux]: https://tech.guitarrapc.com/entry/2022/11/11/031555

デバッグはそれぞれの OS で行えばよいのですが、CI/CD で発行することを考えると、このあたりのクロスコンパイルは物足りないように感じます。(Native AOT や R2R (Ready to Run) とかの実装が関係しているのでしょうか…?)

(クロスコンパイルに関する情報や議論[^cross-compile-linux]はほとんど見つからなかったので、知っている人がいたら教えてほしいです)

[^cross-compile-linux]: すぐに Close されています。https://github.com/dotnet/maui/issues/359

## 結論と個人的な意見

せっかく .NET Frameworks と .NET Core が統合した .NET 5 にて C# におけるクロスプラットフォーム実装が成功したのに、GUI フレームワークにおいてその利点を発揮できないのは残念に思います。

Avalonia や Uno、Eto、gir.core、photino なども素晴らしいソリューションで、選択肢として良いものだと感じます。しかし、私は Microsoft/.NET Foundation が直接開発し、すでに広いコミュニティーを形成している .NET MAUI に希望を見出しています。.NET MAUI はネイティブ実装が先述のものに比べて先進的であり、高度な最適化による高速な実装[^maui-avalonia]が可能です。また、Blazor との相互運用も強力であり、バージョンアップごとに日々進化し続けています[^net9-maui]。.NET MAUI が正式に Linux 対応することにより、それらの数多の恩恵を Linux 上でも享受できるようにすることで、更に優れたフレームワークになると確信しています。

[^maui-avalonia]: https://avaloniaui.net/blog/avalonia-ui-and-maui-something-for-everyone#ui-drawing
[^net9-maui]: https://devblogs.microsoft.com/dotnet/announcing-dotnet-9/#.net-maui-–-enhancing-multi-platform-app-development

少し疑問に感じるのは .NET MAUI 中心開発者たちは Linux 実装を行わない明確な理由を発表しておらず、また議論を行う素振りが見られない点です。Linux 対応を行わないのなら、コミュニティーを納得させることができる、その明確な理由 (既存の実装の安定度を高める必要がある[^about-linux-support]など) を大々的に言うべきだし[^ms-hate-linux]、コミュニティーに開発を任せるとしても、もう少し体制を整えるべきだと感じます。[^developer-with-linux][^issue-in-maui-dev]

[^ms-hate-linux]: Microsoft love Linux と言っている以上、"MAUI の Linux 対応にあまり価値を見出していない" とは言いづらいのかもしれませんが…
[^issue-in-maui-dev]: https://github.com/dotnet/maui/issues/20011#issuecomment-1917751558

.NET MAUI のコミュニティーはある程度大きいです。Linux の実装は GtkSharp の変更なども行う必要があり、難易度は決して低くありませんが、いつかは[多くの人が望む](https://github.com/dotnet/maui/discussions/339#discussioncomment-7581164) Linux 対応を進めることができると信じています。

…

個人的には .NET MAUI と C# が好きですが、同じくらい Linux のことも好きなので、早く対応して欲しいです。可能なら私も maui-linux の開発に協力したいですが、低層は難しくてよくわからないです…