いろいろな種類がある .NET の違いとは

はじめに

こんにちは Synamonでエンジニアをしている庭山です。

Unityでの開発では主に.NET(ドットネット)という環境下、C#というプログラミング言語を使用しています。

また、次世代の .NET 6 というバージョンが近く正式リリース予定(2021年11月)となっています。

そんな .NET ですが、色々とWebを検索や記事を読んでいると

  • .NET
  • .NET Framework
  • .NET Core
  • .NET 5
  • .NET Standard

.NET ●●●という色々な種類があったり

  • Mono
  • Xamarin

.NET という単語すら含んでいなかったりで、初見だと正直「わからん...」な状況になりませんか?

私も実務でUnityを触リ始めるタイミングで本格的に C#を触り始めて、あまり気にしていなかったのですが、改めて調べ整理してみました。

TL;DR

  • .NET ●●● はランタイムの名称
  • コンパイル済みコードを複数のプラットフォーム(OSやランタイム)で動作させるためには .NET Standard をターゲットにライブラリを作成する

App Models

  • .NET 4.x
    • .NET Framework 4.x
    • Windows 向けランタイム
  • .NET Core 3.x
    • Windows以外のOS(LinuxやmacOS)でも互換のあるプログラムを動かすことを目的としたランタイム
  • .NET 5
    • .NET Core 3 の後継(4はスキップされた)
  • .NET 6
    • .NET 5 の後継で 2021年11月頃リリース予定
  • Mono
    • Windows以外のOSで.NET Framework の動作互換を目的として作られたオープンソフトウェア
  • Xamarin
    • Android、iOSを含んだクロスプラットフォームフレームワーク

.NET Standard Library

  • .NET Standard 1.x / 2.x など
    • ランタイム間で互換のある基本API群(BCL、Base Class Library)
    • クラスライブラリ作成などでターゲットを .NET Standard にすることで、実行コードレベルで .NET Standardをベースに作られているランタイム上で互換がある
    • 使用可能なAPIはSystem名前空間以下など限られたクラス群のみ

.NET

一般に.NETという場合、.NET全体の環境を指す。(Wikipedia より引用)

なるほど…。

詳細

色々な種類のランタイムが存在していますが、アーキテクチャを読み解くとその理由も徐々に分かってきました。

f:id:niwayama-synamon:20211013152920p:plain

(引用元:Introducing .NET Standard - .NET Blog

技術レイヤーが別れていて、下にあるものほど土台や基礎を担っているレイヤー(Infrastructure)、上に行くほど応用(Application)になっていることが分かります。

それでは、下のレイヤーから見てみようと思います。

Common Infrastructure

基礎となる言語仕様やそのコンパイラ、ランタイム実装に必要なコンポーネント群です。C#言語仕様やC#コンパイラはここに位置する形になります。

.NET Standard Library

Unity の ビルド設定を編集する Player Settings でも選択できる「あれ」です。

f:id:niwayama-synamon:20211008204626p:plain

Unityでは

  • .NET 4.x (.NET Framework 4.xに相当)
  • .NET Standard

と選ぶことができます。

C#や、Unityを触り始めて日が浅かったりしますと バージョンの数値が大きいほうがなんとなく最新っぽく見える 雰囲気が出てますよね。(実は私は最初そうだと思っていました…)

調べてみると、概ね以下のような存在のようです。

.NET Standard

  • ランタイム実装のための基幹ライブラリ(BCLBase Class Libraryと呼ばれている)
  • クラスライブラリ作成時にターゲットを .NET Standard にすることで .NET Coreや.NET5、Xamarinなどのランタイム各種での動作互換があり、再利用が可能
  • ただし、使用可能なAPIはSystem名前空間以下など限られたクラスのみ

.NET Standard から見た場合の互換性を見ると下図のようになります。

f:id:niwayama-synamon:20211013204306p:plain

例えば

  • .NET Standard をターゲットにビルドされたクラスライブラリは .NET Standard をベースに持つ各実行環境において参照できる
  • .NET Standard をターゲットにビルドできるのはクラスライブラリであり、実行可能なアプリケーションは作成できない
    • .NET Standard は実行環境ではなく、クラスライブラリ群であるため

のようなことが挙げられます。

逆に、下図のようにランタイム間では互換がありません。

f:id:niwayama-synamon:20211012221416j:plain

よって

  • .NET Framework をターゲットにビルドされた実行プログラムは .NET Core のランタイムでは動作しない
  • .NET Framework をターゲットにビルドされたクラスライブラリは .NET Core をターゲットにしているプログラムから参照できない

のようなことが挙げられます。

そして

.NET Standard をターゲットにビルドされたクラスライブラリは .NET Standard をベースに持つ各実行環境において参照できる

を満たすことができれば、ランタイムを問わず様々な環境でビルド済みのコードを動作させることが可能になることになります。

.NET Standard バージョン

とは言っても、.NET Standard にもバージョンが存在します。

主な違いは

  • サポートするクラスライブラリのクラス数
  • サポートする C# の言語バージョン

で、バージョンが上がる毎にサポートする範囲が広くなっています。

結局はランタイムがどのバージョンをベースに実装されているかにも注目が必要ですが、複数のランタイムを前提としている場合は各ランタイムで採用している .NET Standard のバージョンに合わせる形になります。

App Models

基幹レイヤー Common Infrastructure・ .NET Standard を用いたランタイムの実装が行われているレイヤー

アプリケーション開発者がどの環境下で実行可能なのかを決定し、プログラミング・ビルドを行うことで実行可能アプリケーションを作成していくことになります。

Windows の Visual Studio の新規プロジェクト作成ウィザードでコンソールアプリケーションに絞り込んだ場合、このように複数の候補が出てきます。

f:id:niwayama-synamon:20211013161232p:plain

この場合の選択肢は

  • .NET Core
  • .NET Framework

となります。

逆に Mac の Visual Studio の新規プロジェクト作成ウィザードでコンソールアプリケーションに絞り込んだ場合、選択可能な候補は1つだけでした。

f:id:niwayama-synamon:20211013163450p:plain

この場合の選択肢は

  • .NET Core

となります。(.NET Framework はWindows向けランタイムなので選択できない)

主なランタイム

もう少しランタイムの種類について整理してみたところ、以下のようなランタイムがあることが分かりました。

  • .NET Framework 4.x
    • Windows 向けランタイム。Windowsに特化したAPIも持っている
    • 他のOSでは互換がない
  • .NET Core 3.x
    • Windows以外のOS(LinuxやmacOS)でも互換のあるプログラムを動かすことを目的としたランタイム
  • .NET 5
    • .NET Framework 4.xの後継ではなく、.NET Core 3 の後継(4はスキップされた)
  • .NET 6
    • .NET 5 の後継で 2021年11月頃リリース予定。
    • .NET Frameworkは4.8で最終バージョンとなり、今後の流れは .NET 6, .NET 7, .NET 8 ... となっていく予定
    • Xamrin や WPF から 徐々にMAUI へ
  • Mono
    • Windows以外のOSで.NET Framework の動作互換を目的として作られたオープンソフトウェア(.NET Frameworkのすべてをサポートしているわけではない)
    • Unity のC#スクリプト部分は Mono をベースに作られている
  • Xamarin
    • Windows、macOSに加え Android、iOSを含んだクロスプラットフォームフレームワーク

さいごに

.NET というワード1つ掘り下げるだけでもそれなりの情報に辿り着くことができましたが、基幹部分を知ることで見える範囲が広がり色々な応用(.NET以外でも)に繋げられる部分でもあるのでこういうことも大事かな、と思っています。

(*昔ではありますが業務で Java を深掘っていた時期があったので、このあたりの仕組みは似ているかもれないな、と思いました)