.NET MAUI Advent Calendar 2024 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 向けのアプリケーションを既存のコードでビルドすることはほぼ不可能です。
コードの変更や、依存関係などをいろいろ頑張るとなんとか動かなくもないです。1しかし、かなりの手間がかかり、安定度も低く、実装されていない点もいくつかあるため、現時点では推奨しません。
(同一コードではなく、サンプルのコードなら動かしている例があります。しかし、現時点では実用的な段階ではありません2)
.NET 8 の時点では .NET 9 か 10 までにある程度使えるようになったらいいな…と言われていましたが、.NET 9 には全く間に合いませんでした。早くて .NET 1034、もしくはそれ以降になると思われます。
現状開発5が停滞しており (現在の最終 Commit が約7ヶ月前)、使えるようになる目処は立っていません。
なお、Linux 上で VSCode を使い、Android 向けのアプリケーションを作ることは可能です6。
(※以降、本資料での "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 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 もかなりシェア率を伸ばし、特に開発者の中ではその重要度が高まってきています78。日本は Linux のシェア率が低いですが、世界的には普及率が高くなってきています9。(おそらく Steam Deck の影響です)
また、.NET MAUI コミュニティーでも Microsoft による Linux 対応を望む声が多く存在します10。
しかし、"現在サポートしているプラットフォームの安定度を上げることに注力する"という理由を元に、Linux の公式サポートの提案を棄却しています11。(この発言が大々的に公表されていないので、多くのコミュニティーの人々が不満を持っているのですが)
部分的に導入されている箇所
とはいえ、Linux 向けの実装が全く .NET MAUI のリポジトリに追加されていない、というわけではなく、実はグラフィックの実装だけはすでに完成しています12。
それが Microsoft.Maui.Graphics です。
この実装に関しては .NET 6 の早期から完成しており、現在の .NET 8 でももちろん利用可能です。
(個人的に Linux 上での利用に関してはこちらの記事がわかりやすかったです)
System.Drawing が Windows 専用となった13ことで、クロスプラットフォームでのグラフィック描画ではこちらの Microsoft.Maui.Graphics が有力な代替候補14として知られるようになりました。(名前に Maui と入っていますが、Maui でなくても利用できます)
次に実装されそうな部分
これからは段階的に実装していくか、一気に実装されるかはわかりませんが、前者だと Blazor on Linux が有力だと思います。
というのも、2022年から Issue が立っており、(ほとんどの Linux 関連の Issue が Close されているのにも関わらず) Milestone: Backlog として Open されたままだからです。
とはいえ、あまり進んでいないようですが…
現状
.NET MAUI で Linux 向けの実装を行っている Fork は jsuarezruiz/maui-linux です。主に lytico さんが開発していました。
(現在は knocte 氏と webwarrior-ws 氏が主に開発している nblockchain/Mali のほうがやや活発です)
一応 https://github.com/jsuarezruiz/maui-linux/pull/66 のように動かすことはできますが、既存の MAUI 向けのコードではほぼ不可能です。
そもそも dotnet
(コマンド) の workload である gtk
をインストールするのが難しすぎる、という問題もあり、開発自体も困難を極めています。
(これに関しては、Thomas Mielke 氏が Docker の作業環境を整えてくれました: GtkSharp 用, maui-linux 用)
なぐり書きですが、私がリアルタイムで収集している maui-linux 関連の情報をまとめた Zenn scraps です。さすがにひどすぎるので参考にできないと思いますが、一応リンクを掲載しておきます: https://zenn.dev/lemon73/scraps/2449b3317077ba
機能の追加の際は、基本的に GtkSharp の実装に追加する必要があり、GTK の知識が必要となります。(また、現状では GTK3 をベースにしていますが、GTK4 が最新となっているため、これに移行する必要があります)
GtkSharp のメンテナーが少ないということも、Linux 対応があまり進んでいない原因の1つなのかと考えます。
クロスコンパイル
MAUI は Linux に正式対応しておらず、他のフレームワークやライブラリと比較してクロスプラットフォームの対応が弱いです。
それだけでなく、実はクロスコンパイルもややイマイチです。
以下の表をご覧ください。
TFM | Windows | macOS | Linux |
---|---|---|---|
net8.0-android | 15 | ||
net8.0-ios | ⚠️16 | ||
net8.0-maccatalyst | ⚠️16 | ||
net8.0-windows |
(引用: https://zenn.dev/proudust/articles/2022-12-06-build-maui-on-gh-actions#tfm-とビルドまたは発行可能な-os)
この表はクロスコンパイルについて示しています。(データは .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 向けを発行できますが17)
デバッグはそれぞれの OS で行えばよいのですが、CI/CD で発行することを考えると、このあたりのクロスコンパイルは物足りないように感じます。(Native AOT や R2R (Ready to Run) とかの実装が関係しているのでしょうか…?)
(クロスコンパイルに関する情報や議論18はほとんど見つからなかったので、知っている人がいたら教えてほしいです)
結論と個人的な意見
せっかく .NET Frameworks と .NET Core が統合した .NET 5 にて C# におけるクロスプラットフォーム実装が成功したのに、GUI フレームワークにおいてその利点を発揮できないのは残念に思います。
Avalonia や Uno、Eto、gir.core、photino なども素晴らしいソリューションで、選択肢として良いものだと感じます。しかし、私は Microsoft/.NET Foundation が直接開発し、すでに広いコミュニティーを形成している .NET MAUI に希望を見出しています。.NET MAUI はネイティブ実装が先述のものに比べて先進的であり、高度な最適化による高速な実装19が可能です。また、Blazor との相互運用も強力であり、バージョンアップごとに日々進化し続けています20。.NET MAUI が正式に Linux 対応することにより、それらの数多の恩恵を Linux 上でも享受できるようにすることで、更に優れたフレームワークになると確信しています。
少し疑問に感じるのは .NET MAUI 中心開発者たちは Linux 実装を行わない明確な理由を発表しておらず、また議論を行う素振りが見られない点です。Linux 対応を行わないのなら、コミュニティーを納得させることができる、その明確な理由 (既存の実装の安定度を高める必要がある11など) を大々的に言うべきだし21、コミュニティーに開発を任せるとしても、もう少し体制を整えるべきだと感じます。722
.NET MAUI のコミュニティーはある程度大きいです。Linux の実装は GtkSharp の変更なども行う必要があり、難易度は決して低くありませんが、いつかは多くの人が望む Linux 対応を進めることができると信じています。
…
個人的には .NET MAUI と C# が好きですが、同じくらい Linux のことも好きなので、早く対応して欲しいです。可能なら私も maui-linux の開発に協力したいですが、低層は難しくてよくわからないです…
-
サンプルコードは動かせますが、.NET MAUI の利点である、Windows, macOS, Android, iOS との同一コードにはおそらくできません。(https://www.youtube.com/watch?v=s-clGkUbk84) ↩
-
https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$xcsGDT9pWQyi4x33fHi0FSWxLgXt_7OTT9LFducXtdM?via=matrix.org&via=krutonium.ca ↩
-
https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$gg-A3LcjyKyhvH0v3v06-I-PyfoDsCb4oGU9A0PIFLk?via=matrix.c3s.cc&via=matrix.org&via=krutonium.ca ↩
-
https://techcommunity.microsoft.com/blog/educatordeveloperblog/-net-maui-on-linux-with-visual-studio-code/3982195 ↩
-
https://github.com/dotnet/maui/discussions/339#discussioncomment-7581164 (1/3に近い開発者が Linux/Unix を利用しています (何故かパーセントの合計が100%を越していますが、重複ありなのでしょうか…?)) ↩ ↩2
-
https://github.com/dotnet/maui/discussions/339#discussioncomment-345663 ↩
-
https://www.reddit.com/r/linuxmasterrace/comments/1ax0sh3/i_created_a_map_of_the_linux_market_share/ ↩
-
https://github.com/dotnet/maui/issues/11738#issuecomment-1732013969 ↩ ↩2
-
https://github.com/dotnet/maui/issues/1126#issuecomment-913582819 ↩
-
https://learn.microsoft.com/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only ↩
-
https://learn.microsoft.com/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only#recommended-action ↩
-
.csproj
ファイルの変更が必要 ↩ -
すぐに Close されています。https://github.com/dotnet/maui/issues/359 ↩
-
https://avaloniaui.net/blog/avalonia-ui-and-maui-something-for-everyone#ui-drawing ↩
-
https://devblogs.microsoft.com/dotnet/announcing-dotnet-9/#.net-maui-–-enhancing-multi-platform-app-development ↩
-
Microsoft love Linux と言っている以上、"MAUI の Linux 対応にあまり価値を見出していない" とは言いづらいのかもしれませんが… ↩
-
https://github.com/dotnet/maui/issues/20011#issuecomment-1917751558 ↩