【2020年版】.NET Framework / .Net Core / Xamarinの関係を整理~そして.NET 5へ

.NET関連のフレームワークは概念も歴史も複雑でよくわからなくなりがちです。
.NET 5という大きい転換点が訪れるこのタイミングで、現時点で.NETの理解に必要な知識をざっとまとめてみました。

はじめに.NET Frameworkありき

.NETをめぐる物語は2000年にマイクロソフトMicrosoft .NETという戦略を発表するところから始まります。
そしてその後に、この構想が実装されたものとして、.NET Frameworkが誕生します。
.NET Frameworkを使うとWindowsアプリケーションやWebアプリケーションを作ることができます。

いろんな言語で書ける.NET Frameworkの思想

さてこの.NET Frameworkの特徴として、いろんな言語で記述が行えるということがあります。
例えば今、同じ処理をC#で書いたソースコードVisual Basic .NETで書いたソースコードがあることを考えます。

.NET Frameworkでは、これらを一度共通中間言語(Common Intermediate Language / CIL)と呼ばれるものに変換します。
このCILは、C#からコンパイルしてもVB.NETからコンパイルしても同じものが出来上がります。
つまりこの時点で言語間の差異が吸収されます。

f:id:halya_11:20200523203835p:plain
共通中間言語コンパイル

ただしCILはまだ機械が読める状態ではないのでここからさらにネイティブコードへの変換をかける必要があります。
このときに使われるのが共通言語ランタイム(Common Language Runtime / CLR)と呼ばれる仮想マシンです。
これがCILを読んで処理を行うことにより最終的にソースコードが実行されます。

f:id:halya_11:20200523203934p:plain
CLRがCILを処理

マルチプラットフォームの.NET Core

前節の.NET FrameworkWindows上で動作します。
これに対してC#VB.NETなどで書いたソースコードを他のプラットフォームでも動作するようにしたフレームワーク.NET Coreです。
.NET CoreはMicrosoftが2016年にMITライセンスで公開したOSSで、WindowsLinuxmacOSで動作するアプリを開発できます。

さて、.NETのプログラムは前述のCILの形式で配布され、それを動かすための仮想マシンが前述のCLRです。
.NET FrameworkCLRはあくまでWindows上で動作するためのものです。
そこで.NET Coreでは、CoreCLRというマルチプラットフォームに対応した仮想マシンを実装しています。
またCILの仕様やCLRが実装すべき仕様は共通言語基盤(Common Language Infrastructure / CLI)として決められているので、CoreCLRもこれに準ずる形で実装されています。

f:id:halya_11:20200523204737p:plain
CLIに基づいたCLRの実装

.NETの互換環境であるMono / Xamarin

さて、実は.NET Coreの公開よりも前から.NETのマルチプラットフォーム化を進めるプロジェクトがありました。
それがMonoです。
MonoがCILを読むために使うMonoランタイムはiOSAndroidをはじめとする多くのプラットフォームで動くように作られています。

またMonoは.NETと同様に、各言語をコンパイルしてCIL形式にしたりCLIに基づいた実装が行われていますが、
実装自体は当初Microsoftと異なる団体が進めていたこともあり.NETの別実装・互換環境という位置づけになります。

f:id:halya_11:20200524193751p:plain
.NETの互換環境

ちなみに.NETで仕様が決められている部分以外はその他のフレームワークと異なっていても問題はないため、
例えばガベージコレクションなどはMonoが独自のものを実装したりしていました(最近の状況は不明)。

なおMonoはXamarin社によって管理されていましたが、2016年にMicrosoft社に買収されました。

.NET Standardで互換性を担保

さてこのように.NET及びその互換環境はいくつもあるものの、これらはすべて.NETの仕様に準拠しています。
つまり、例えばXamarinでC#コンパイルして作ったCILを他の環境で実行したりできるということです。
これは.NETの思想の重要な部分なのですが、プラットフォーム特有の処理が入っていたりすると当然そううまくはいきません。

そこで、プラットフォームなどに依存しない共通のAPIを仕様として定義して、どの.NET環境でもこれらを実装するように決めました。
これが.NET Standardです。
さらに.NET Standardは下位バージョンとの互換性を完全に担保します。
つまり、.NET Standardに準拠した環境で作られたCILであれば、それ以上のバージョンの.NET Standard環境で実行できるということになります。

そして.NET 5へ

さてこのようにややこしい.NETですが、近年Microsoftによる各フレームワークの統合が進められています。
2019年のMicrosoft Buildでは、.NET Frameworkと.NET Core、Xamarinを統合して一つのフレームワークとすることが発表されました。
この新しいフレームワークを.NET 5といいます。

.NET 5のリリースは2020年11月の予定ですが、それに先駆けてプレビュー版が3月にリリースされました。

www.publickey1.jp

さらに今年のMicrosoft Build 2020では各プラットフォームのUIを単一のコードで作れる
「.NET Multi-platform App UI(.NET MAUI)」が発表されたりと、大きく状況が変わりそうな展開になってきています。

www.publickey1.jp

参考

www.atmarkit.co.jp

www.atmarkit.co.jp

www.infoq.com

ja.wikipedia.org

ja.wikipedia.org

www.infoq.com

qiita.com

ascii.jp

hatappo.hatenadiary.jp

www.buildinsider.net

ja.wikipedia.org

docs.microsoft.com

ja.wikipedia.org

qiita.com

Unityと.NET

docs.microsoft.com

e-words.jp

www.publickey1.jp

www.publickey1.jp