.NET メモ

.NET WPF サンプル集 [.NET 6, netFx47 対応]

ASP.NET Core サンプル集 [.NET 6 対応]

2023年版: GUIライブラリの選定

.NET 6 に上げたとしても, Windows-only でよいのなら, GUI は WPF でよい。デザインが古臭いところが難点。

▲ WinUI
GUI については, 商業的に大失敗した黒歴史の UWP を畳むために, Microsoft は、Project Reunion や、その名前をどんどん変えて WinUI 3, Windows App SDK を相次いで投入している。しかし, グチャグチャで大混乱している。

WinUI3 in Windows App SDK は, UWP に投資してしまった開発者のために、デスクトップアプリで作り直すための移植なので、UWP のダメなところもそのまま持ち込んでいる。 v1.2 (November 2022) は, Visual Studio の XAML デザイナで編集もできない。(どうしろと?)

UWP に手を出していなかった幸運な開発者は、WinUI3 を選ぶ理由はない。

From Discussion: WinUI 3.0 XAML Designer #5917: 2020年11月の issue #3656と, 2021年9月にこれが立てられたが、2023年3月時点で見込みなし。最後のコメントがこれ;

何年にもわたるコミュニティの要求にもかかわらず、Microsoft がこの機能を提供しなかったことは容認できません。 Microsoft が言っているように,「Visual Studio でサポートしないため、フレームワーク (winui または maui) を使用しないでください。 Avalonia UI と Rider に行け。彼らは両方とも、私たちが提供できない開発者向けの xaml デザイナーを持っています…」
Avalonia UI
Multi-platform であれば, Avalonia UI が実用アプリケィション開発実績も多く、好ましい。
▲ .NET MAUI (Xamarin.Forms から改称)
Native デスクトップアプリのライブラリで, Microsoft が作ったものではないので、良さそうに見える。マルチウィンドウ、メニューバー、カメラへのアクセスも対応。XAML (コントロール名は WPF と大きく違う.) で UI を書き、開発中は XAML Live Preview がある。

ビジュアルデザイナはない。 .NET 6時点ではまだまだ未完成。.NET 7 以降に期待。

Uno Platform
UWP の後継。Pixel-perfect, C# / XAML apps on MacOS.

古い

▲ WinForms (Windows Forms .NET)
.NET 8 でもサポートされている。しかし、新規開発で選ぶことはないかな。.NET Core 3.1 で非推奨コントロールがまとめて削除された。これらを使っていなかった場合は、引き続きサポート可能。
✘ UWP
Windows-only で、もはや選ぶ理由がない。移行先は WinUI ではなく, Uno Platform.
▲ Xamarin.Forms
ビルド時にネイティブUIにマップされる。.NET MAUI が後継.
Eto.Forms
マイナ。

.NET の Windows 以外への対応状況

.NET は元々 Java 対抗だったが、紆余曲折ののち, .NET Core 1.0 で Linux, macOS にも対応。

Distribution 状況
Fedora 37 公式リポジトリに .NET 6, .NET 7: dotnet-sdk, aspnetcore-runtime, dotnet-runtime パッケージあり。
Debian 11 dotnet パッケージなし (Microsoft のリポジトリ利用)。mono 6.8 を公式リポジトリが提供。
openSUSE Leap 15.5 dotnet は Microsoft のリポジトリを利用。mono 6.8 が公式リポジトリに含まれる。

2023.3現在, FreeBSD 向けは、いくつか有志によるバイナリパッケージがある。

各 OS への展開は、Java に比べて弱い。.NET 実装は, Microsoft の dotnet と Mono (.NET Framework 4.7レベル) がある。前者は Windows, Linux, macOS (x86, x64, Arm64) のみ。Mono は *BSD, PowerPC (AIX), s390x などでも動くらしいが、すでに古い。

仕様: Javaと対比

標準化・文書化

例えば Scala は Java Virtual Machine (JVM) 上で動く。その意味は, Scala コンパイラが Scala ソースコードを Java バイトコードに変換し, JVM は Java バイトコードを実行する。VM の仕様がしっかりしていれば、その上で動くプログラミング言語のプロジェクトと、各 OS 上で動く VM の開発が別のサイクルで回せる。

Java は仕様が The Java Language SpecificationThe Java Virtual Machine Specification に分かれていて、バージョンアップのたびにきっちり更新されている。仕様を見るだけで挙動が完全に分かるかまでは調べていないが、Oracle、こういうところはしっかりしている。

GraalVM など, 代替の実装もある。

対して, .NET のほうは, Common Language Runtime (CLR) が実行環境。CLR は中間コード (Intermediate Language; IL) を動かす。同様に, 例えば IronPython は CLR 上で動く。

仕様は, ECMA-335 Common Language Infrastructure (CLI) として纏められている。が、最新が 2012年の 6th edition. 10年間も仕様に追加がないとか、そんなわけなかろーもん。実際、目立つところでは, C# 8.0 + CLR for .NET Core (CoreCLR) 3.0 [2019年9月] でインタフェイスのデフォルト実装が入っている。

文書化が行われていない。.NET のドキュメントのグチャグチャ振りを見るに、ここに弱さがある。

Generics・総称型

.NET で書いていると、非ジェネリックな型とジェネリックな型が別々になっていて、混乱しているのが気になる。IList インタフェイスは IList<T> インタフェイスとはまったく異なる。 たとえば, 具象クラス List<T> は, System.Collections.Generic.IList<T>, System.Collections.IList の両方を実装している。自分でクラスを作るときも、このように両方のインタフェイスの実装が必要。

他方 Java は, List<E> インタフェイスだけが存在する。この点は, Java のほうがだいぶ良い。

.NET Core 2.0 以降は, .NET Framework 4.7, Mono 6.4 と互換性を持たせるために .NET Standard 2.0 に準拠している。いまさら互換性を落とせない。