Windows用として生まれて、クロスプラットフォームに育った.NETの宿命というか。System
名前空間から始まるライブラリと、Microsoft
名前空間から始まるライブラリの話。
System or Microsoft
Systemなんて名前、基本的には標準ライブラリ用なわけですが。
「.NET系開発者はサードパーティ ライブラリにも平然とSystem
の名前を付けることがある」みたいな問題もありますが、それは今回は置いておきます。今回は割かし標準に近いところ、マイクロソフトによる公式実装のライブラリの話です。
「.NET = マイクロソフト」(他のOSは「そのマイクロソフト.NETの移植」)だった頃には割かし何でもSystem
名前空間にされていたわけですが、オープンソース、コミュニティによる推進、クロスプラットフォームなんかをうたうようになった最近はそれではまずいということで、Microsoft
名前空間なライブラリが増えています。
Systemやめました
WindowsにべったりなものがSystem
名前空間だったんですよねぇ、長らく。それが徐々に、クロスプラットフォームに耐えうるものがSystem
、そうでないものは別の名前空間へと変化。だいたい、2012年頃(Windows 8が出た頃、.NET的には.NET 4.5くらいの頃)が境目。
GUIフレームワーク
「Windowsにべったり」というとGUIフレームワーク系のもので、以下のような感じ。わかりやすく、「.NETから分離します」「System
やめます」の流れ。
-
Windows Forms (System.Windows.Forms.dll)
- .NET 1.0時代からあるGUI
- だいたいのクラスが
System.Windows.Forms
名前空間 - Win32 API感丸出し。
- それでも、Monoががんばって移植作業したのでなんとか「標準」の体は保ってる
-
WPF (WindowsBase.dll, PresentationCore.dll, PresentationFramework.dll)
- だいたいのクラスが
System.Windows
名前空間 - .NET 3.0。この時代もまだまだ
System
名前空間 - アセンブリ名からは
System
が外れる - さすがに高機能すぎて移植無理で、完全にWindows用
- だいたいのクラスが
-
Windows Runtime, Windows.UI
-
ついに、GUIフレームワークは.NETから分離
- WPF的なものをC++ネイティブ実装した上で、.NETから参照しやすいAPI用意したもの
- .NETの世代的には.NET 4.5時代の出来事
- 名前空間はさすがに
Windows
-
ついに、GUIフレームワークは.NETから分離
Web
ASP.NETもSystem
名前空間をやめました。まあ「標準」に組み込むにはちょっとでかすぎる感じはあります。
境目は5。ASP.NET MVC 4まではSystem.Web.Mvc
名前空間。ASP.NET MVC 5でMicrosoft.AspNet
に。Webフレームワークの1つにすぎないASP.NETがWeb
名前空間を名乗る仰々しさも軽減。
悪名高きSystem.Web.dll (IISにべったり)依存とかも切って、晴れてクロスプラットフォームに。
Systemやめてませんでした
ここまではわかりやすく、「System
やめました」なものなのでいいんですが。問題はここから。
プレビュー版実装から標準に昇格
.NET 4辺りの頃からなんですが、プレビュー版の間は仮にMicrosoft
名前空間で実装しておいて、標準ライブラリに取り込めるとなった段階で初めてSystem
名前空間に変更するというような開発フローを取っていました。
-
dynamic関連
- プレビューの頃は
Microsoft.Dynamic
- .NET 4では
System.Dynamic
- プレビューの頃は
-
Task関連
- プレビューの頃は
Microsoft.Threading.Tasks
- .NET 4では
System.Threading.Tasks
- プレビューの頃は
-
async関連
-
プレビューの頃は
Microsoft.Runtime.CompilerServices
- (
Task
クラスなどの既存のクラスの拡張はSystem
名前空間。CompilerServices
だけが新規)
- (
- .NET 4.5では
System.Runtime.CompilerServices
-
プレビューの頃は
これは「System
に正式配属されました」なので問題ないんですが、ちょっと困るのがこの先。
バックポーティング実装
この手の新機能を、古いフレームワーク上でも使えるようにするバックポーティング実装があります。
-
Microsoft.Bcl
- .NET 4.5の
CallerMemberNameAttribute
、Tuple
、IProgress
なんかを.NET 4で使えるようにするもの
- .NET 4.5の
-
Microsoft.Bcl.Async
- C# 5 (.NET 4.5)の非同期メソッドを.NET 4で使えるようにするもの
-
Microsoft.Net.Http
- .NET 4.5の
System.Net.Http.HttpClient
を.NET 4で使えるようにするもの
- .NET 4.5の
こいつら、中身の名前空間はSystem
のくせに、パッケージ名はMicrosoft
。プレビュー時代の名残なのかなんなのか。(未来の)標準ライブラリなのに。
やっぱりSystemダメでした
同系統で、一瞬「標準」に昇格した奴がいます。
-
System.Diagnostics.Tracing.EventSource
- ETW (Event Tracing for Windows)へのログ書き込みを.NETから簡単に行えるようにするもの。
- .NET 4.5で追加
お気づきでしょうか。ETWのWの文字。「for Windows」。これまで「.NET 4.5のあたりでWindowsべったりな奴はSystem
から外れた」とさんざん説明してきたところで、こいつの存在に頭抱えることに。
ちなみに、こいつ、その後も、Microsoft
名前空間実装が生き残っていたりします。
-
Microsoft.Diagnostics.Tracing.EventSource
-
曰く
- 「
EventSource
クラスは標準にも含まれているけど、こっちの方が新しくて機能多い」 - 「
System.Diagnostics.Tracing.EventSource
の方にとりこまれるまでのギャップ解消に使って」
- 「
-
曰く
「System
の方にとりこまれるまで」と書かれているものの、何かこのままMicrosoft
の方にすべきなんじゃないかという予感もひしひしと…
逆に、なぜMicrosoft…
逆に、「なぜそれをMicrosoft
名前空間にした」というものもあったりはします。
こいつ。
-
Microsoft.CSharp
-
C# 4のdynamicの中で使うやつ
- C#のオーバーロード解決ルールに従って、実行時バインディングするためのライブラリ
-
この名前で、C#コンパイラーそのものを指すライブラリではないのでそこも要注意
- コンパイラーそのものはMicrosoft.CodeAnalysis.CSharp
-
C# 4のdynamicの中で使うやつ
C# 4のdynamicを使うのに必須のライブラリです。Mono版C#コンパイラーでも必須(Mono版のMicrosoft.CSharp
実装あり)です。確かに、C#に依存した機能なのでSystem
名前空間だと変なんですが。一方で、マイクロソフト実装でなくても必須なものにMicrosoft
名前空間というのも嫌な感じで。
まとめ
最近のノリだと、
- .NET Core (オープンソースでクロスプラットフォームな.NET)でも「標準」となるべき基本ライブラリだけが
System
名前空間 - その他のマイクロソフト公式実装は
Microsoft
名前空間
になっているんですが、過去さかのぼると何でも間でもSystem
名前空間だったし、その名残がいまだちらほらあったりします。特に、System.Diagnostics.Tracing.EventSource
とかどうするんだろう…