.NET Standardである意味
それではライブラリを組み込んだアプリケーションのアーキテクチャについて説明します。しかしその前に、今一度DioDocsが.NET Standardで実装されているメリットについてお話ししたいと思います。
前回、DioDocsに対して私が特に魅力を感じる点を次の通り挙げました。
- ExcelファイルからPDFファイルの生成
- .NET Standard 2.0準拠
- ランタイムフリー
- Excel準拠のオブジェクトモデル
- 開発元は日本が本社の企業なので直接サポートが受けられる
2番目に .NET Standardに準拠していることを挙げています。これは否が応でも徐々に.NET Frameworkから.NET Coreへ移行していく必要があることに端を発しています。
.NET Coreというとクロスプラットフォームな.NETのランタイムで、ASP.NET Coreといったサーバーサイド用のイメージがある方も多いかもしれません。しかし実際にはすでにその範疇を超えつつあります。
現在の.NETの大まかな方針として、すでに新規機能の追加やパフォーマンスの改善は.NET Coreが開発の中心に移行されており、新しく開発された機能などの.NET Frameworkへの適用は、後方互換性を担保しやすい範囲に限られて提供されています。
実際にC# 8.0で追加される機能のいくつかは、次のバージョンである.NET Framework 4.8に適用されないことが判明しています。.NET Frameworkのメジャーバージョンは4.8が最後? という予測もあります。
このあたりの詳細は併せて以下をご覧ください。
ではWindows FormsやWPFがどうなるかというと、.NET Core 3.0から.NET Core上でも動作するようになります。現時点ではプレビューの段階で、実プロダクトへの投入はしばらく先になるかと思いますが、非常に魅力的な話です。現状の.NET CoreにおけるWindows FormsやWPFの対応状況は、以下のブログを参考すると空気感が伝わるのではないでしょうか?
.NET Frameworkが終息に向かい、.NET Coreへの移行が求められる状況について、個人的には決して悲観的なことではないと考えています。どちらかというとワクワクしています。実際、私は自部署の技術戦略として積極的に.NET Coreへ移行・投資していこうと考えており、金融機関向けの業務システムにおいてすでに採用を進めています。
これはひとえに .NET Coreが非常に魅力的であるからです。特に次の魅力を感じます。
- Side-by-sideをサポートしており、複数バージョンの.NET Coreが共存できる
- ランタイムを同梱できるため、インストールされているバージョンに縛られない
- .NET Coreの先進的な機能や性能を享受できる
- クラウドを見据えたときに基盤技術を共有しやすい
特に1.と2.はエンタープライズな現場でも、非常に魅力的です。これで顧客環境の古い.NET Frameworkのバージョンに悩まされることがなくなります。さようなら、.NET Framework 3.5!
エンタープライズ領域の業務アプリケーションでも、クラウドファーストな顧客が増えており、大手金融機関でも全体的にその方向に向かっていると実感しています。さらに配布などを考慮すると、オンプレミスであってもDockerコンテナの利用などを進めていきたいと考えています。そうなった場合、OSとしてはLinuxを視野に入れていく必要があり、.NET Coreのクロスプラットフォーム対応に魅力を感じます。
総括すると、現在は.NET Frameworkから.NET Coreへ移行する過渡期にあると言えるでしょう。だからこそ、サードパーティのライブラリは.NET Standardであることに大きなメリットがあります。
ここで改めて、.NET Frameworkと.NET Core、.NET Stanadrdの関係を簡単に整理します。次の図をご覧ください。
- 出典:Cesar de la Torre [MSFT]、.NET Core, .NET Framework, Xamarin – The “WHAT and WHEN to use it” – Cesar de la Torre [Microsoft] – BLOG
この図にはUnityやGTK#など、.NET関連のすべてのプロダクトが含まれているわけではありませんし、一番上の段にXamarinと記載されている箇所はMonoといった方が適切な気がしますが、大枠を理解するには便利なモデルだと思います。
.NET Frameworkや.NET CoreはMono(Xamarin)と並んで、.NETのランタイムです。そして当然それらのランタイムの上では基本となるクラス群(stringやDateTimeなどなど)が共通して利用できます。それがBase Librariesです。
Base Librariesの実装はランタイム環境によって異なりますが、自由に実装しているわけではもちろんなく、共通の規格に則って実装されています。その共通規格が .NET Standardです。
.NET Standardにはバージョンがあり、各ランタイムのバージョンごとにサポートする.NET Standardのバージョンが異なります。具体的には次のような対応関係にあります。
.NET Standard | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 2.0 | |
---|---|---|---|---|---|---|---|---|---|
.NET Core | 1.0 | 1 | 1 | 1 | 1 | 1 | 1 | 2.0 | |
.NET Framework 1 | 4.5 | 4.5 | 4.5.1 | 4.6 | 4.6.1 | 4.6.1 | 4.6.1 | 4.6.1 | |
Mono | 4.6 | 4.6 | 4.6 | 4.6 | 4.6 | 4.6 | 4.6 | 5.4 | |
Xamarin.iOS | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10.14 | |
Xamarin.Mac | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3.8 | |
Xamarin.Android | 7 | 7 | 7 | 7 | 7 | 7 | 7 | 8 | |
Unity | 2018.1 | 2018.1 | 2018.1 | 2018.1 | 2018.1 | 2018.1 | 2018.1 | 2018.1 |
例えば、.NET Coreの1.0であれば.NET Standard 1.6までサポートしており、.NET Standard 2.0を利用する場合は.NET Core 2.0以上が必要になるといった形で読み解きます。
つまり.NET Frameworkと.NET Coreの過渡期である現在、採用するライブラリが.NET Standardに対応していれば、いずれの環境でも利用することが可能であり、その点に大きな魅力があると私は考えています。
前回の記事でも触れた通り、ExcelのCOM操作は非常にリスクの高い技術であるため、どうしてもExcelでないと不可能な機能の実装を除き、利用するべきではないと思います。それを除外しても、.NET Standard対応のライブラリを利用することは、中長期的な視野に立つとメリットが大きいと考えられます。