mono, netcore, netstandard

Connect2016のQ&AセッションでMiguelが質問されて回答していたので、前々から(.NET Fringe Japanの頃から)書こうと思っていたネタをざっくり書こうと思います。

 

.NET CoreはMonoの代わりにはなりません。

 

.NET Coreは「クロスプラットフォーム.NET Frameworkのサブセット」であり、その立ち位置はどのプラットフォームに行っても変わりません。

 

Monoは.NET Framework相当のオープンソース実装なのです。

 

.NET Coreでデスクトップ相当の機能は使えないのです。たとえばWindows Forms。System.Xamlも使えないでしょう。WCFのサーバサイドも動かないでしょう(まあ、もともと未完成ですが)。System.MessagingやSystem.DirectoryServicesみたいなのも動かないんじゃないかな。

 

Gtk#とそれに基づくアプリケーションを動かせるのも、現状ではMonoだけでしょう。これまで何度も書いてきましたが、MonoにはMonoのエコシステムがあるのです。

それは簡単になくなるようなものではない。

 

実装面でも、Monoのクラスライブラリは着実にreferencesourceや、最近はcorefxも取り込んだりしていますが、それでたとえばmscorlib.dllの内容が変えられるものではないわけです。

 

.NET Standardの説明とかでよく出てくるのがコレですが、

https://msdnshared.blob.core.windows.net/media/2016/09/dotnet-tomorrow.png

 

この図は誤解を招くので、使うべきではありません(断言)。ここでrule them allしているOne libraryは、ただのreference libraryなのです。実装ではないのです。だから、実際にはプラットフォーム毎に実装ライブラリがあるわけです。oneどころではない。紛らわしいから、one libraryなんて軽々しく言うべきではないのです。

 

.NET Coreと.NET Standardの関係も、当初の.NET Coreの目論見からはだんだん離れつつあるのかもしれません。個人的にはいいことだと思っています。.NET Coreはデスクトップやモダンなモバイルという、基本的にはそれなりにリッチな環境をターゲットにしているわけで、もう少し小さなフレームワークでは実現が難しいでしょう。Unityみたいな環境もあるわけですし。過去の最小限のデータアクセスAPIでは、ASP.NET Coreアプリケーションの開発も困難であると言えそうですし。

 

というわけで、.NET Coreは標準APIという足枷を外して、ただし無分別にレガシーを取り込むこと無く、進んでいけばいいなと思っています。