.NET関連のフレームワークは概念も歴史も複雑でよくわからなくなりがちです。
.NET 5という大きい転換点が訪れるこのタイミングで、現時点で.NETの理解に必要な知識をざっとまとめてみました。
- はじめに.NET Frameworkありき
- いろんな言語で書ける.NET Frameworkの思想
- マルチプラットフォームの.NET Core
- .NETの互換環境であるMono / Xamarin
- .NET Standardで互換性を担保
- そして.NET 5へ
- 参考
はじめに.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からコンパイルしても同じものが出来上がります。
つまりこの時点で言語間の差異が吸収されます。
ただしCILはまだ機械が読める状態ではないのでここからさらにネイティブコードへの変換をかける必要があります。
このときに使われるのが共通言語ランタイム(Common Language Runtime / CLR)と呼ばれる仮想マシンです。
これがCILを読んで処理を行うことにより最終的にソースコードが実行されます。
マルチプラットフォームの.NET Core
前節の.NET FrameworkはWindows上で動作します。
これに対してC#やVB.NETなどで書いたソースコードを他のプラットフォームでも動作するようにしたフレームワークが.NET Coreです。
.NET CoreはMicrosoftが2016年にMITライセンスで公開したOSSで、Windows・Linux・macOSで動作するアプリを開発できます。
さて、.NETのプログラムは前述のCILの形式で配布され、それを動かすための仮想マシンが前述のCLRです。
.NET FrameworkのCLRはあくまでWindows上で動作するためのものです。
そこで.NET Coreでは、CoreCLRというマルチプラットフォームに対応した仮想マシンを実装しています。
またCILの仕様やCLRが実装すべき仕様は共通言語基盤(Common Language Infrastructure / CLI)として決められているので、CoreCLRもこれに準ずる形で実装されています。
.NETの互換環境であるMono / Xamarin
さて、実は.NET Coreの公開よりも前から.NETのマルチプラットフォーム化を進めるプロジェクトがありました。
それがMonoです。
MonoがCILを読むために使うMonoランタイムはiOSやAndroidをはじめとする多くのプラットフォームで動くように作られています。
またMonoは.NETと同様に、各言語をコンパイルしてCIL形式にしたりCLIに基づいた実装が行われていますが、
実装自体は当初Microsoftと異なる団体が進めていたこともあり.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月にリリースされました。
さらに今年のMicrosoft Build 2020では各プラットフォームのUIを単一のコードで作れる
「.NET Multi-platform App UI(.NET MAUI)」が発表されたりと、大きく状況が変わりそうな展開になってきています。