.NET とは結局なんぞやと詳細に見てみる

# 更新履歴
2024/10/04 : .NET Framework が現役である理由と根拠を追加。
2024/10/04 : .NET 対応言語が複数ある旨を追加。C++/CLI を追記。


# .NET とは何か、概要をつかむ
Microsoft 公式情報曰く、.NET とは様々な種類のアプリケーション (モバイル、ゲーム、デスクトップなど) 開発ができて、尚且つクロスプラットフォームにも対応しているオープンソースの開発プラットフォームであるようです。

> .NET は、さまざまな種類のアプリケーションを構築するための、無料でクロスプラットフォームのオープンソース開発者用プラットフォームです。
[Microsoft Learn # .NET の概要](https://learn.microsoft.com/ja-jp/dotnet/core/introduction)

**用語説明**
- **クロスプラットフォーム** : [あるコンピュータプログラム（ソフトウェア）を、複数の異なる仕様の機種やオペレーティングシステム（OS）で同じように動作させられること](https://e-words.jp/w/%E3%82%AF%E3%83%AD%E3%82%B9%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0.html)を指します。Windows、MacOS、Linux など OS が違っても同じように動くことです
- **オープンソース** : 企業や個人などが[ソースコードを広く一般に公開し、誰でも自由に扱ってよいとする考え方](https://e-words.jp/w/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9.html)です

また、Microsoft .NET videos では、.NET について次のように紹介されていました。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/d8b5c6d8-cdbf-23c2-57e6-5b4e51cfe59f.png)
[What is .NET? [Pt 1] | .NET for Beginners](https://www.youtube.com/watch?v=6BcPIvVfVAw&list=PLdo4fOcmZ0oUwBEC2bnwPtHqbU8Vmh_tj&index=1&ab_channel=dotnet)

意味的には、無料で使えるオープンソース且つクロスプラットフォーム対応の開発者プラットフォームということなので、先ほどの公式情報と同じようです。


# C# 言語と .NET は同じものであるか
Microsoft Learn でも注意されていますが、この 2 つは別物です。

> C# プログラミング言語は .NET であると考えている人もいます。 しかし、C# と .NET は別のものです。 C# はプログラミング言語の構文です。
[Microsoft Learn # .NET とは何ですか?](https://learn.microsoft.com/ja-jp/training/modules/dotnet-introduction/2-what-is-dotnet)

C# 言語はプログラミング言語であり、.NET は開発プラットフォームです。

先ほどの .NET videos の内容を参考にすると、開発プラットフォームの定義としてはプログラミング言語とライブラリがセットになったものであるとのことです。


# .NET で使用可能な言語
先述の内容にも共通しますが、.NET では複数言語をサポートしています。

> .NET プラットフォーム上で C#、F#、Visual Basic の 3 つの言語を提供しています。
[Microsoft Learn # Microsoft .NET 言語の戦略](https://learn.microsoft.com/ja-jp/dotnet/fundamentals/languages)

> You can write your .NET apps in C#, F#, or Visual Basic.
[Microsoft .NET # .NET Programming Languages](https://dotnet.microsoft.com/ja-jp/languages)

> C#、F#、または Visual Basic を使用して、複数のオペレーティングシステムとデバイスの Web とネイティブアプリケーションをビルドします
[Microsoft Visual Studio # .NET アプリケーションを開発する](https://visualstudio.microsoft.com/ja/vs/features/net-development/#:~:text=%E9%AB%98%E3%81%84%E7%94%9F%E7%94%A3%E6%80%A7%E3%80%81%E5%A4%9A%E7%9B%AE%E7%9A%84%E3%80%81)

これにより、C# 言語と .NET は同一でないと証明されます。
また、各言語と .NET の詳細は下記情報から参照してください。

- [C#](https://learn.microsoft.com/ja-jp/dotnet/fundamentals/languages#c)
- [F#](https://learn.microsoft.com/ja-jp/dotnet/fundamentals/languages#f)
- [Visual Basic](https://learn.microsoft.com/ja-jp/dotnet/fundamentals/languages#visual-basic)

また、上記以外の言語もサポートされているようです。
(@albireo さん、ありがとうございます！)

現状、公式情報としては C++/CLI の確認が出来ています。
[Microsoft Learn # C++/CLI による .NET プログラミング](https://learn.microsoft.com/ja-jp/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=msvc-170)

他に対応しているものもあるようですので、公式情報が見つかり次第更新します。


# 関連する用語について
.NET の他にも .NET Framework や .NET Core といった単語などをよく見かけます。
これらに違いはあるのでしょうか。

## .NET Framework
まずはじめに「.NET Framework」が生まれました。

> .NET Framework - 初代の .NET。Windows と Windows Server の幅広い機能にアクセスできます。 これは、メインテナントで積極的にサポートされています。
[Microsoft Learn # .NET の概要 - .NET エコシステム
](https://learn.microsoft.com/ja-jp/dotnet/core/introduction#net-ecosystem)

「一応これ自体も現役で使われてるよ」という前置きは入れておいて、この .NET Framework のバージョンでは、次の目標として、開発者が 1 つのコードを記述してそれを複数の OS で使えたら良いよね (つまりクロスプラットフォーム化) が浮かんできます。

> 2002 年以降、Microsoft により、.NET のバージョンがクロスプラットフォームの互換性を持つようにする作業が行われました。 目標は、開発者が 1 つのコード ベースを記述して、それを macOS、Linux、Windows の各オペレーティング システムで使用できるようにすることでした。
[Microsoft Learn # .NET とは何ですか? - .NET の簡単な歴史
](https://learn.microsoft.com/ja-jp/training/modules/dotnet-introduction/2-what-is-dotnet#a-brief-history-of-net)

## .NET Core
先述の目標を実現し、クロスプラットフォームに対応させたバージョンが .NET core です。

> 目標は、開発者が 1 つのコード ベースを記述して、それを macOS、Linux、Windows の各オペレーティング システムで使用できるようにすることでした。
これらの取り組みにより、2014 年頃に .NET Core が導入されました。
[Microsoft Learn # .NET とは何ですか? - .NET の簡単な歴史
](https://learn.microsoft.com/ja-jp/training/modules/dotnet-introduction/2-what-is-dotnet#a-brief-history-of-net)

> .NET (Core) -- 最新の .NET。 .NET Framework との大幅な互換性を保ちながら、クラウド時代に向けて見直された、クロスプラットフォームでオープンソースの .NET 実装。 Linux、macOS、Windows 向けに積極的にサポートされています。
[Microsoft Learn # .NET の概要 - .NET エコシステム
](https://learn.microsoft.com/ja-jp/dotnet/core/introduction#net-ecosystem)

## .NET
クロスプラットフォーム対応後に .NET Core も着々とバージョンを重ねていきますが、その後、メジャー バージョン 5 にて名前から Core が削除され、今に至ります。

> 新機能と機能強化の対象は .NET Core です。 その後、名前から Core が削除されました。 次のメジャー バージョンは、.NET 5、.NET 6、.NET 7、.NET 8 などです。
[Microsoft Learn # .NET とは何ですか? - .NET の簡単な歴史
](https://learn.microsoft.com/ja-jp/training/modules/dotnet-introduction/2-what-is-dotnet#a-brief-history-of-net)

ただ、何もないのに突然「Core」の文字を消すのも不自然なので、当然何かありました。

実は .NET Core がバージョンを重ねるまでの間に [Mono](https://www.mono-project.com/docs/about-mono/) という .NET 関連のフレームワークが台頭したりしていて、これは .NET Core の至らない点を補うものでした。

具体的にいうと、.NET Core が Windows、MacOS、Linux でのクロスプラットフォーム化を実現したのに対し、Mono は Android、iOS 等の小規模な OS にも対応していました。

> 以前に .NET Core と呼ばれていた .NET は .NET のクロスプラットフォーム実装であり、サーバーとクラウドのワークロードをその規模に応じて処理するように設計されています。 また、デスクトップ アプリなどの他のワークロードもサポートされています。 Windows、macOS、および Linux で実行されます。
[Microsoft Learn # .NET 実装 - .NET 5 以降のバージョン](https://learn.microsoft.com/ja-jp/dotnet/fundamentals/implementations#net-5-and-later-versions)

> Mono は、主に小規模なランタイムが必要な場合に使用される .NET 実装です。 Android、macOS、iOS、tvOS、および watchOS 上の Xamarin アプリケーションで利用されるランタイムで、フットプリントが小さいことに重点を置いています。
[Microsoft Learn # .NET 実装 - Mono](https://learn.microsoft.com/ja-jp/dotnet/fundamentals/implementations#mono)

そのため、.NET Core と Mono、加えて .NET Framework もついでに統合しちゃえ！ってことで、メジャー バージョン 5 を起点にして色々と切り替わったのです。

> Microsoft では、いくつかの重要なフレームワーク (.NET Framework、.NET Core、および Xamarin/Mono) のソース コード ストリームを統合する計画を打ち出しています。この取り組みによって、今世紀の初頭には別々に分かれていたスレッドを統合して、開発者が作業を行うための 1 つのターゲット フレームワークを提供する予定です。
[Microsoft Learn # 再統合された .NET:.NET 5 に関する Microsoft の計画](https://learn.microsoft.com/ja-jp/archive/msdn-magazine/2019/july/csharp-net-reunified-microsoft%E2%80%99s-plans-for-net-5#c)

> 以降の .NET の主要な実装であることを強調するために、名前から "Core" を削除しました。 .NET 5 では、.NET Core または .NET Framework よりも多くの種類のアプリと多くのプラットフォームをサポートしています。
[Microsoft Learn # .NET 5 の新機能](https://learn.microsoft.com/ja-jp/dotnet/core/whats-new/dotnet-5)

統合は凄く大変だったらしいですが、ここから先が皆が良く知る .NET になります。

とはいえ、.NET 5 の正式版は [2020 年 11 月 10 日発表](https://devblogs.microsoft.com/dotnet/announcing-net-5-0/)と Microsoft では割と最近の話です。
(フロントエンドだと古めの技術なんだよなぁ……恐ろしい)

ですので、業務ではまだ全然 .NET 5 以前を使ってる会社さんも多数あります。

## ちょっとした補足
先述の通り、.NET Framework は現役で Windows OS に組み込まれています。

> .NET Framework は Windows に引き続き含まれ、削除される予定はありません。
[Microsoft Learn # .NET Framework のバージョンおよび依存関係](https://learn.microsoft.com/ja-jp/dotnet/framework/migration-guide/versions-and-dependencies)

~~理由としては、別に Windows OS を使うってハッキリ決まってるのに、クロスプラットフォーム対応が売りの .NET 環境にする必要も無いじゃん？とか勝手に解釈してます。~~

> .NET Framework は、Windows アプリと Web サービスの構築と実行をサポートするテクノロジです。 .NET Framework は、次の目的を実現するためにデザインされています。
> - 次のようなコード実行環境を提供する。
>   - ソフトウェアの展開とバージョン管理の競合を最小化する。
>   - 作成者が不明なコードや、完全には信頼できないサード パーティ製のコードも含めた、コードの安全な実行を促す。
>   - スクリプトやインタープリターが実行される環境でのパフォーマンスの問題を回避する。
> 
> [Microsoft Learn # .NET Framework の概要](https://learn.microsoft.com/ja-jp/dotnet/framework/get-started/overview)

理由について、.NET には完全な互換性がある訳ではない旨のコメントをいただきました。
公式情報の内容を確認しても、確かに「使用しているアプリケーションが特定のバージョンに依存しているのでアンインストールしないでね」と書かれていました。

> 一般に、コンピューターにインストールされている .NET Framework のバージョンはアンインストールしないでください。使用するアプリケーションが特定のバージョンに依存しており、バージョンが削除されると破損する可能性があるからです。
[Microsoft Learn # .NET Framework のバージョンおよび依存関係 - .NET Framework 1.0
](https://learn.microsoft.com/ja-jp/dotnet/framework/migration-guide/versions-and-dependencies#net-framework-10)


言い換えれば .NET には完全な互換性は無いから削除しないでねということになりますね。
(@culage さん、コメントありがとうございます！)


# .NET を取り敢えず勉強するなら
Microsoft が 20 分程度のトレーニング出しているので、オススメです。

https://learn.microsoft.com/ja-jp/training/modules/dotnet-introduction/

また、.NET 関連の用語集は下記になります。

https://learn.microsoft.com/ja-jp/dotnet/standard/glossary

## 参考にさせていただいた情報
- [.NETって何？](https://qiita.com/unwissenheit/items/d3595809864aca2f2d9a)
- [「.NET 5」の正式版がついにリリース！新しく追加された機能をまとめて解説](https://devlog.mescius.jp/dotnet-5-release/)
- [.NET Framework 4.8 と .NET 5.0 は全く違う、両者の扱い方の注意点を解説します。](https://wake-mob.jp/2020/11/02/net-framework-4-8-%E3%81%A8-net-5-0-%E3%81%AF%E5%85%A8%E3%81%8F%E9%81%95%E3%81%86%E3%80%81%E4%B8%A1%E8%80%85%E3%81%AE%E6%89%B1%E3%81%84%E6%96%B9%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9%E3%82%92%E8%A7%A3/)
- [.NET？Framework？Core？色々あるから整理しよう](https://qiita.com/nv_1234/items/e45f34a648e88a6e0974)
- [.NET Framework / .NET Standard / .NET Core とは何か？](https://blog.hiros-dot.net/?p=9086)