ポータブル.NETプロジェクト〜開発プロジェクト毎に隔離された異なる.NET Framework SDKバージョンをインストールする方法を解説
Published: 2023-01-13 20:46:28

## .NETの異なるバージョン

![image](https://user-images.githubusercontent.com/1316994/212168234-2a5f5e93-e992-4dda-8d99-e6a1dd4c351e.png)

https://dotnet.microsoft.com/ja-jp/download

.NETにはバージョンがあります。

## 異なるバージョンの互換性の問題

通常の手順に従うとローカルマシンのグローバル環境にインストールすることになり、たとえば、.NET6.0から.NET7.0にアップグレードする際など、既存の個別の.NETプロジェクトでバージョン互換性の問題が発生してしまいます。

Dockerなどのコンテナ技術は、このような複数の異なるバージョンを互いに安全に隔離して、異なるバージョンでそれぞれ開発されたプロジェクトやアプリケーションを運用するために開発された技術であると言えます。

## 環境の隔離

![docker](https://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Docker_%28container_engine%29_logo.svg/375px-Docker_%28container_engine%29_logo.svg.png)

> [Docker（ドッカー）](https://ja.wikipedia.org/wiki/Docker)は、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンプラットフォームである[5]。

## .NET Framework での side-by-side 実行

https://learn.microsoft.com/ja-jp/dotnet/framework/deployment/side-by-side-execution

> side-by-side 実行は、アプリケーションまたはコンポーネントの複数のバージョンを同じコンピューターで実行する機能です。 共通言語ランタイムの複数のバージョン、および 1 つの共通言語ランタイムを使用するアプリケーションとコンポーネントの複数のバージョンを同じコンピューターで同時に実行できます。

https://atmarkit.itmedia.co.jp/fdotnet/technology/idnfw11_04/idnfw11_04_01.html

>.NET Frameworkのバージョン・ポリシー

>　これまで、開発者はソフトウェアのバージョンについて、次のような悩みを抱えていた。

> - ユーザーにできるだけ新しいバージョンを使ってもらいたい。
> - 下位互換性のテストはやりたくないし、完全にはできない。
　また、ユーザーはユーザーで次のような悩みを抱えていた。

> - 新しいバージョンを入れた結果、既存のアプリケーションが動かなくなるのは困る。
> - 新バージョンに問題がある場合は、素早く簡単に、うまく動作していた以前のバージョンに戻したい。

>　.NET Frameworkには、これまでの反省が大いに活かされている。ここからは、.NET Frameworkのソフトウェアのバージョン管理方法を解説しよう。

.NETでは実行時からして、バージョン非互換の問題が発生しないようなバージョン・ポリシーがある優れた設計です。

## ポータブル.NETプロジェクトの作成が可能

.NET Frameworkでは実行時だけではなく、開発プロジェクト毎に異なるSDKバージョンをインストールすることができます。いわばポータブル.NETプロジェクトが作成可能なのです。

繰り返しですが、通常の手順に従うとローカルマシンのグローバル環境にインストールすることになり、たとえば、.NET6.0から.NET7.0にアップグレードする際など、既存の個別の.NETプロジェクトでバージョン互換性の問題が発生してしまいます。

しかし、ちょっとした工夫でDockerのような仕組みを必要とせず、プロジェクト・ディレクトリー毎に異なる.NET Framework環境を安全に隔離することができます。

## ポータブル.NETプロジェクトの作成アウトライン

#### 1. .NET-SDKダウンロード

公式サイトから任意のプラットフォームの特定バージョンの.NET-SDKのバイナリ（アーカイブ）をダウンロードする

#### 2. プロジェクト・ディレクトリにSDKを配置
プロジェクトディレクトリ下に.NET-SDKディレクトリを作成し、そのディレクトリ下で解凍・展開

#### 3. PATHを通す
ターミナル環境とVSCodeで.NET-SDKの相対PATHを通す

## 1. .NET-SDKダウンロード

公式サイトから任意のプラットフォームの特定バージョンの.NET-SDKのバイナリ（アーカイブ）をダウンロードします。

https://dotnet.microsoft.com/ja-jp/download

![image](https://user-images.githubusercontent.com/1316994/212196103-1a74c712-25c0-4ae2-915a-0f326f65cfa3.png)

 **おすすめ** 、とも書いてあるし、最近安定リリースされた.NET 7.0をLinux環境にインストールすることにします。

[全 .NET 7.0 ダウンロード](https://dotnet.microsoft.com/ja-jp/download/dotnet/7.0)

![image](https://user-images.githubusercontent.com/1316994/212203481-d099e693-18a4-4b46-936f-1b97a4728233.png)

ここで、通常のインストールならば、OS毎の **インストーラー** を選択することになるのですが、ポータブルSDKインストールのためにはバイナリを個別に指定してダウンロードします。また、[dotnet-install scripts](https://dotnet.microsoft.com/ja-jp/download/dotnet/scripts)でもできないことはないかもしれませんが、事前知識やコマンドが煩雑になると思います。

今回は、LInux/[x64](https://dotnet.microsoft.com/ja-jp/download/dotnet/thank-you/sdk-7.0.102-linux-x64-binaries)プラットフォームのバイナリをダウンロードします。

![image](https://user-images.githubusercontent.com/1316994/212204472-fdcf89ca-96a6-452d-ba1f-0a396388f7c1.png)

`dotnet-sdk-7.0.102-linux-x64.tar.gz` というような特定のバージョンと特定のプラットフォームのアーカイブファイルがダウンロードされるはずです。

## 2. プロジェクト・ディレクトリにSDKを配置

プロジェクトディレクトリ下に.NET-SDKディレクトリを作成し、そのディレクトリ下でダウンローしたアーカイブファイルを解凍・展開していきます。

任意のプロジェクト・ディレクトリを作成します。今回は`fs-test` という名前のF#(.NET)のためのプロジェクトを作成します。

以下ターミナル環境

```sh
$ mkdir fs-test
```

作成したディレクトリへ移動し、さらに.NET-SDKのディレクトリを作成します。なんでも良いのですが、`.net`という名前のディレクトリを作成します。

```sh
$ cd fs-test
$ mkdir .net
```

適当なアンアーカイバ−を利用し、すでにダウンロードしているファイルを解凍し、このディレクトリ下に配置します。

結果、以下のようなディレクトリ構成になるようにします。

```sh
fs-test
└── .net
    ├── dotnet
    ├── host
    ├── LICENSE.txt
    ├── packs
    ├── sdk
    ├── sdk-manifests
    ├── shared
    ├── templates
    └── ThirdPartyNotices.txt
```





## 3. PATHを通す

ターミナル環境とVSCodeで.NET-SDKの相対PATHを通します。

https://dotnet.microsoft.com/ja-jp/download/dotnet/thank-you/sdk-7.0.102-linux-x64-binaries


には、


![image](https://user-images.githubusercontent.com/1316994/212208051-fa0772f1-8b54-4f0e-b408-0e95ba6ca931.png)

とありますが、これは`$HOME`に配置されたSDKへのPATHを通す方法です。

`$HOME/dotnet` の代わりに`./.net/dotnet`  と相対パスにする方法もありますが、自分はZSHの`.zshrc`で、以下のように`dotnet`コマンドのエイリアスを作りました。


```sh
alias dotnet='.net/dotnet'
```

ターミナル環境（ZSH）を再度立ち上げるなどして、環境偏向を反映させます。

カレントディレクトリがプロジェクトルートの `fs-test`であることを確認した上で、`dotnet`コマンドが通るか？正しいバージョンが表示されるか？確認します。

```sh
$ dotnet --version
7.0.102
```

これで、別の.NETプロジェクトでたとえばNET6.0-SDKを配置した場合、同じコマンドで、相対PATHでプロジェクトローカルのSDK特定されるので、異なる適切な.NETバージョンが表示されるはずです。

ポータブル.NETプロジェクトのSDKのディレクトリである`.net`のサイズは535.6Mでした。


## Next

### [VSCodeでF#.NETの開発環境構築する方法を解説](https://dev.to/ken_okabe_jp/vscodedefnetnokai-fa-huan-jing-gou-zhu-surufang-fa-wojie-shuo-5do3)