.NET Framework と .NET

## はじめに

仕事として、ソフト開発に従事していた頃は、Microsoftサポート範囲の Windows（Home and Pro）と Windows Server を対象として、複数のライブラリと複数のデスクトップアプリで構成されるパッケージを主に担当していました。
このような構成のソフトであったこともあり、C# フレームワークは、最新の .NET ではなく、プレインストールされている .NET Framework を使い続けてきました。

このように .NET Framework を使い続けてきて、.NET はイマイチ知識不足なこともあり、自分自身として整理する目的で、.NET Framework と .NET について記載することにしました。

**2025/03/10 追記**
.NET、.NET Framework について、[Visual Studio と C#、および、フレームワーク（プラットフォーム）の関係](https://qiita.com/chai0917/items/16d65b899c734e7417b7) という記事も投稿しています。


## .NET Framework

https://dotnet.microsoft.com/ja-jp/learn/dotnet/what-is-dotnet-framework

.NET Framework の変遷として、`1.0`、`1.1`、`2.x～3.x`、`4.x` はそれぞれ独立していたということなどは、現時点では不要な知識なので、今現在、.NET Framerowk を利用する上での情報をまとめることにしました。

### ブレインストール

Windows（Home and Pro）、Windows Server に対する .NET Framework ランタイムのプレインストール状況を表記します。
※表は OS Build 降順としています。

| OS | Version | OS Build | OSサポート期限 | .NET Framework |
|---------------------|:----:|:-----:|:----------:|:-----:|
| Windows Server 2025 | 24H2 | 26100 | 2034-10-10 | 4.8   |
| Windows 11          | 24H2 | 26100 | 2026-10-13 | 4.8   |
| Windows 11          | 23H2 | 22631 | 2025-11-11 | 4.8   |
| Windows 11          | 22H2 | 22621 | 2024-10-08 | 4.8   |
| Windows 11          | 21H2 | 22000 | 2023-10-10 | 4.8   |
| Windows Server 2022 | 21H2 | 20348 | 2031-10-14 | 4.8   |
| Windows 10          | 22H2 | 19045 | 2025-10-14 | 4.8   |
| Windows 10          | 21H2 | 19044 | 2023-06-13 | 4.8   |
| Windows Server 2019 | 1809 | 17763 | 2029-01-09 | 4.7.2 |
| Windows Server 2016 | 1607 | 14393 | 2027-01-12 | 4.6.2 |


Microsoftサポート範囲の OS を対象とすることを前提として考えます。

Windows 10, Windows 11 は、Windows as a Service ということで、次バージョンへの無償アップデートが前提なので、基本的には、最新バージョンを対象と考えれば良いです。
Windows Server は、次バージョンへの無償アップデートはなく、サーバーという性質上、セキュリティパッチのみ実施して、機能強化アップデートは実施しないケースもあるので、現時点では、Windows Server 2016 - .NET Framework 4.6.2 を考慮する必要があります。

Windows のみを対象とする場合、.NET Framework 4.0～4.8 を利用するモジュールとしてビルドが望ましいです。
Windows Server も対象とする場合、.NET Framework 4.0～4.6.2 を利用するモジュールとしてビルドが望ましいです。

::: note
上記状況なので、Visual Studio 2022 では、オプションで「.NET Framework 4.6.2-4.7.1 開発ツール」の選択が可能となっています。 
:::

### ライフサイクル

https://learn.microsoft.com/ja-jp/lifecycle/products/microsoft-net-framework

.NET Framework の基本的なライフサイクルポリシーは、ブレインストールされている OS のサポート期限までサポートが保証されます。

| バージョン         　  | リリース日 | サポート期限 |
| -------------------- | :--------: | :--------: |
| .NET Framework 4.8.1 | 2022-08-09 | ー         |
| .NET Framework 4.8   | 2019-04-18 | ー         |
| .NET Framework 4.7.2 | 2018-04-30 | ー         |
| .NET Framework 4.7.1 | 2017-10-17 | ー         |
| .NET Framework 4.7   | 2017-04-11 | ー         |
| .NET Framework 4.6.2 | 2016-08-02 | 2027-01-12 |

::: note
.NET Framework 4.8 は Windows Server 2025 にプレインストールされています。Windows Server 2025 のサポート期限が 2034-10-10 なので、少なくとも 2034-10-10 まではサポートが保証されます。
さらに、次に発売される OS に .NET Framework 4.8（4.8.1）がプレインストールされればそのサポート期限がさらに延びるということになります。
今のところ、Microsoft は新バージョンの開発は終了しても、現行 .NET Framework 4.8（4.8.1）の次期 OS へのプレインストールを続けるとアナウンスしています。このためサポート期限は未定です。
:::

### OS毎の利用可否

https://learn.microsoft.com/ja-jp/dotnet/framework/get-started/system-requirements

| OS | 4.6.2 | 4.7 | 4.7.1 | 4.7.2 | 4.8 | 4.8.1 |
| -- | :---: | :--: | :--: | :---: | :--: | :--: |
| Windows Server 2025 |   |   |   |   | ■ | 〇 |
| Windows 11          |   |   |   |   | ■ | 〇 |
| Windows Server 2022 |   |   |   |   | ■ | 〇 |
| Windows 10          |   |   |   |   | ■ | 〇 |
| Windows Server 2019 |   |   |   | ■ | 〇 |   |
| Windows Server 2016 | ■ | 〇 | 〇 | 〇 | 〇 |   |

### Global Assembly Cache（GAC）

https://learn.microsoft.com/ja-jp/dotnet/framework/app-domains/gac

マネージモジュール配置として、side-by-side ではなく .NET Framework システムフォルダに配置して、各アプリで参照する形態です。

マネージの Dll 参照順位は「GAC」「side-by-side」の順となり、GAC が優先参照されるので、複数パッケージで共有されている Dll を GAC 登録してしまうと、パッケージの保守/アップデートで問題が起こる可能性があります。

:::note warn
パッケージの独立性を維持する上で、複数パッケージで共用する Dll を GAC に登録すべきではありません。
共用する GAC の Dll 更新が必要となった場合、該当 Dll を参照する複数パッケージを同時にアップデートが必要となることがあるためです。
:::

::: note
アンマネージの Dll 参照順位は「side-by-side」「環境変数 PATH 指定フォルダ」の順なので、環境変数 PATH 指定フォルダの Dll 更新が必要となった場合、side-by-side 配置に変更するという逃げ道を利用することで、他パッケージとの干渉なくアップデートすることができます。 
（本来は、すべて side-by-side として独立性を維持するのが基本です）
:::


## .NET

https://dotnet.microsoft.com/ja-jp/learn/dotnet/what-is-dotnet

.NET は、.NET Core、.NET Framework、Xamarin を統合したクロスプラットフォームのフレームワークで、無料のオープンソースとして公開されています。

### プレインストール

現時点では、Windows OS に対して、.NET ランタイムはプレインストールされていません。

### ライフサイクル

https://learn.microsoft.com/ja-jp/lifecycle/products/microsoft-net-and-net-core

| バージョン    | リリース日 | サポート期限 |
| ------------ | :--------: | :--------: |
| .NET 9       | 2024-12-03 | －         |
| .NET 8（LTS）| 2023-11-14 | 2026-11-10 |
| .NET 7       | 2022-11-08 | 2024-05-14 |
| .NET 6（LTS）| 2021-11-08 | 2024-11-12 |

- LTS（長期的なサポート）
  - 奇数年にリリースされ、最初のリリースから 3 年間サポートされます。
- STS（標準期間サポート）
  - 偶数年にリリースされ、それ以降の STS または LTS リリースから 6カ月間サポートされます。
  - リリースは、基本的に 12か月ごとに行われるため、STS リリースのサポート期間は 18カ月となります。

::: note
上記リリース形態となっているので、LTS にあわせて、開発ソフトのアップデートを行うのが望ましいです。 
:::


### OS毎の利用可否

https://github.com/dotnet/core/blob/main/release-notes/8.0/supported-os.md

| OS | .NET 8（LTS） | .NET 9 |
| -- | :-----------: | :----: |
| Windows Server 2025 | 〇 | 〇 |
| Windows 11          | 〇 | 〇 |
| Windows Server 2022 | 〇 | 〇 |
| Windows 10          | 〇 | 〇 |
| Windows Server 2019 | 〇 | 〇 |
| Windows Server 2016 | 〇 | 〇 |


### アプリケーションの発行

https://learn.microsoft.com/ja-jp/dotnet/core/deploying/

開発プロジェクトにおける CI 観点からは、コマンドラインでの手法が必要ですが、まずは、手作業の手順を記載しておきます。
ソリューションエクスプローラーで、プロジェクトを選択、右クリックで「発行」を選択します。

![cap2-vs-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963267/041497c5-09c1-cc7b-bade-3acd110eac9f.png)

ターゲット等をステップに従い選択します。

![cap2-vs-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963267/56419413-a8bc-b3c3-7664-47174d9b0b58.png)

![cap2-vs-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963267/cb888383-b003-8fe1-1aa5-3babfdccdba4.png)

![cap2-vs-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963267/678b0fc3-7c39-11c9-cfca-3c2e4df656d4.png)

上記で「完了」を選択して発行が完了すると、下記画面が表示されるので「すべての設定を表示」を選択します。

![cap2-vs-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963267/9331750c-90e7-4396-7358-00c390efedc2.png)

配置モードとして「フレームワーク依存」「自己完結」の選択ができます。

![cap2-vs-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963267/10f1ab17-edd0-8792-7ed0-10957f9657f0.png)

「自己完結」を選択した場合は「単一ファイルの作成」にチェックをします。

![cap2-vs-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963267/11ecbfb6-c9aa-9c79-4490-7436081c8b8b.png)


- フレームワーク依存
  - 対象アプリと依存関係のみを含むアプリが生成されます。このように発行した場合、実行環境に .NET ランタイムを別途導入が必要となります。
　
 - 自己完結
   - .NET ランタイムとライブラリ、さらに対象アプリと依存関係を含むアプリが生成されます。このように発行した場合、.NET ランタイムがインストールされていないコンピューター上で対象アプリを実行可能となります。


## メリットとデメリット

### .NET Framework 利用
- メリット
  - 現時点では、プリインストールされている .NET Framework ランタイムを利用するだけなので、手間がかかりません。
　
- デメリット
  - 開発終了しているので、機能強化は望めなく、いつかは終焉が訪れます。


### .NET 利用

- メリット
  - Android、Apple、Linux、Windows オペレーティング システムで利用可能です。
　
- デメリット
  - .NET ランタイムは、Windows OS にプレインストールされていません。
  - ライフサイクルが LTS でも 3年間と比較的短く感じます。