インストール - .NET SDK
.NETをインストールする前に
.NETをインストールする前に、テレメトリ機能を無効にする。
vi ~/.profile
# ~/.profileファイル
export DOTNET_CLI_TELEMETRY_OPTOUT=1
# または
export DOTNET_CLI_TELEMETRY_OPTOUT=true
オプトアウトとは、個人情報の第三者提供に関し、個人データの第三者への提供を本人の求めに応じて停止することである。
依存関係のライブラリのインストール
パッケージ管理システムからインストール
パッケージ管理システムを使用してインストールする場合、以下のライブラリが自動的にインストールされる。
# RHEL libicu openssl openssl-libs krb5-server krb5-libs # SUSE libicu60_2 libicu-suse65_1 openssl openssl-1_1 libopenssl1_1 krb5
※注意
.NET Core 2.1以前のバージョンをインストールする場合、以下に示すライブラリもインストールする必要がある。
# RHEL sudo dnf iinstall libunwind libuuid # SUSE sudo zypper install libunwind libuuid1
手動でインストール
手動で.NETをインストールする場合および自己完結型ソフトウェアを公開する場合は、以下の依存関係のライブラリをインストールする。
# RHEL sudo dnf install curl libcurl lttng-ust libicu openssl openssl-libs krb5-server krb5-libs # SUSE sudo zypper install libicu60_2 libicu-suse65_1 openssl openssl-1_1 libopenssl1_1 krb5 または sudo zypper install lttng-ust libcurl zlib libicu60_2 libicu-suse65_1 openssl openssl-1_1 libopenssl1_1 krb5 # Mobian sudo apt install curl zlib1g liblttng-ust1 libicu72 openssl libssl3 libkrb5-3 # Manjaro ARM sudo pacman -S --needed curl zlib lttng-ust icu openssl krb5
※注意
.NET Core 2.1より以前のバージョンには、以下の依存関係のライブラリもインストールする必要がある。
# RHEL sudo dnf iinstall libunwind libuuid # SUSE sudo zypper install libunwind libuuid1
リポジトリの登録
パッケージ管理システムからインストール
.NET SDKをインストールする前に、以下のコマンドを入力して、Microsoftリポジトリキーを登録する。
# RHEL # RHELに.NETをインストールするには、Red Hat Subscription Managerを使用して登録する必要がある sudo rpm -Uvh https://packages.microsoft.com/config/rhel/9/packages-microsoft-prod.rpm # SLE 15 sudo rpm -Uvh https://packages.microsoft.com/config/sles/15/packages-microsoft-prod.rpm sudo ln -s /etc/yum.repos.d/microsoft-prod.repo /etc/zypp/repos.d/microsoft-prod.repo # openSUSE Leap 15 sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc wget https://packages.microsoft.com/config/opensuse/15/prod.repo sudo mv prod.repo /etc/zypp/repos.d/microsoft-prod.repo sudo chown root:root /etc/zypp/repos.d/microsoft-prod.repo
リポジトリを最新の状態にするため、以下のコマンドを入力する。
# RHEL sudo dnf update # SUSE sudo zypper update
手動でインストール
リポジトリの登録は不要である。
.NET SDKのインストール
.NET SDKを使用すると、.NETを使用したソフトウェアが開発できる。
.NET SDK をインストールする場合は、対応するランタイムをインストールする必要はない。
パッケージ管理システムからインストール
.NET SDKをインストールするには、以下のコマンドを実行する。
# RHEL # .NETは、RHEL 9のAppStreamリポジトリに含まれている sudo dnf install dotnet-sdk-X.0 # X : メジャーバージョン # SUSE sudo zypper install dotnet-sdk-X.0 # X : メジャーバージョン
手動でインストール
まず、Microsoftの公式Webサイトにアクセスして、.Net SDKをダウンロードする。
ダウンロードしたファイルを解凍して、任意のディレクトリに保存する。
tar xf dotnet-sdk-<バージョン名>-linux-x64.tar.gz mv dotnet-sdk-<バージョン名>-linux-x64 <任意のディレクトリ>
次に、~/.profileファイル等に、環境変数PATH
を設定する。
vi ~/.profile
# ~/.profileファイル
export PATH="<.NET SDKのインストールディレクトリ>:$PATH"
.NETランタイムのインストール
パッケージ管理システムからインストール
ASP.NETランタイムを使用すると、ランタイムを提供しない.NETを使用して開発されたソフトウェアが実行できる。
.NETの最も互換性の高いランタイムであるASP.NETランタイムがインストールには、以下のコマンドを実行する。
# RHEL sudo dnf install aspnetcore-runtime-X.0 # X : メジャーバージョン # SUSE sudo zypper install aspnetcore-runtime-X.0 # X : メジャーバージョン
ASP.NETランタイムの代替手段として、ASP.NETを含まない.NETランタイムをインストールする場合は、以下に示すコマンドを実行する。
# RHEL sudo dnf install dotnet-runtime-X.0 # X : メジャーバージョン # SUSE sudo zypper install dotnet-runtime-X.0 # X : メジャーバージョン
手動でインストール
Microsoftの公式Webサイトにアクセスして、.NETランタイムをダウンロードする。
ダウンロードしたファイルを解凍して、任意のディレクトリに保存する。
tar xf runtime-<バージョン名>-linux-x64-binaries.tar.gz mv runtime-<バージョン名>-linux-x64-binaries <任意のディレクトリ>
次に、~/.profileファイル等に、環境変数PATH
を追記する。
vi ~/.profile
# ~/.profileファイル
export PATH="<.NETランタイムのインストールディレクトリ>:$PATH"
.NET Core 3.1 SDKのインストール
.NET Core 3.1 SDKを使用すると、.NETを使用したソフトウェアが開発できる。
.NET Core 3.1 SDKをインストールする場合は、対応するランタイムをインストールする必要はない。
パッケージ管理システムからインストール
.NET Core 3.1 SDKをインストールするには、以下のコマンドを入力する。
sudo zypper install dotnet-sdk-3.1
.NET Core 3.1 ランタイムのみをインストールするには、以下のコマンドを実行する。
sudo zypper install dotnet-runtime-3.1
もし、ASP.NET Core ランタイムも必要ならば、それもインストールする。
※注意
ASP.NET CoreのSDKは、.NET Core SDKに含まれているので注意すること。
sudo zypper install aspnetcore-runtime-3.1
手動でインストール
まず、Microsoftの公式Webサイトにアクセスして、.NET Core 3.1 SDKをダウンロードする。
ダウンロードしたファイルを解凍して、任意のディレクトリに保存する。
tar xf sdk-<バージョン名>-linux-x64-binaries.tar.gz mv sdk-<バージョン名>-linux-x64-binaries <任意のディレクトリ>
次に、~/.profileファイル等に、環境変数PATH
を追記する。
vi ~/.profile
# ~/.profileファイル
export PATH="<.NET Core SDK 3.1のインストールディレクトリ>:$PATH"
.NET Core 3.1 ランタイムをインストールする場合も同様、Microsoftの公式Webサイトにアクセスして、.NET Core 3.1 ランタイムをダウンロードする。
ダウンロードしたファイルを解凍して、任意のディレクトリに保存する。
tar xf runtime-<バージョン名>-linux-x64-binaries.tar.gz mv runtime-<バージョン名>-linux-x64-binaries <任意のディレクトリ>
次に、~/.profileファイル等に、環境変数PATH
を追記する。
vi ~/.profile
# ~/.profileファイル
export PATH="<.NET Core ランタイムのインストールディレクトリ>:$PATH"
複数のバージョンのインストール (手動)
.NET Foundationが提供するインストールスクリプトを使用して、.NETの複数のバージョンをインストールできる。
または、以下に示すコマンドを実行して、インストールスクリプトをダウンロードすることもできる。
wget https://dotnet.microsoft.com/download/dotnet/scripts/v1/dotnet-install.sh
インストールシェルスクリプトのマニュアルは、Microsoftの公式Webサイトにある。
現在、Microsoftから配布されている.NET SDKのバージョンを確認する場合は、.NETの公式Webサイトを参照すること。
インストールシェルスクリプトに実行権限を付加する。
chmod u+x ./dotnet-install.sh
.NET SDKをインストールする。
--channel
オプション- STS
- 最新の標準期間サポートリリース。
- LTS
- 最新の長期サポートリリース。
- 特定のリリースを表す A.B 形式の2部構成のバージョン
8.0
等
- 特定のSDKリリースを表す A.B.Cxx 形式の3部構成のバージョン
8.0.302
や6.0.423
等- .NET 5以降で使用できる。
- STS
-InstallDir <.NET SDKのインストールディレクトリ>
または--install-dir <.NET SDKのインストールディレクトリ>
- .NET SDKのインストールディレクトリを指定する。
# 最新の.NET SDKをインストールする場合 ./dotnet-install.sh --install-dir <.NET SDKのインストールディレクトリ> -channel LTS -version latest # .NET SDK 9.0.100をインストールする場合 ./dotnet-install.sh --install-dir <.NET SDKのインストールディレクトリ> -channel <STS または Current> -version 9.0.100 # .NET SDK 8.0.302 (LTS)をインストールする場合 ./dotnet-install.sh --install-dir <.NET SDKのインストールディレクトリ> -channel LTS -version 8.0.302 # .NET SDK 6.0.403 (LTS)をインストールする場合 ./dotnet-install.sh --install-dir <.NET SDKのインストールディレクトリ> -channel LTS -version 6.0.423
また、インストールする前に-Dryrun
オプションまたは--dry-run
オプションを付加して、インストールをシミュレートすることもできる。
# 最新の.NET SDKのインストールをシミュレートする場合 ./dotnet-install.sh -Dryrun --install-dir <.NET SDKのインストールディレクトリ> -channel LTS -version latest
インストールの完了後、利用可能な.NET SDKを確認することができる。
dotnet --list-sdks
複数のバージョンのアンインストール (手動)
dotnet-install.shファイルを使用してインストールした.NETをアンインストール手順を記載する。
自動化された.NET Uninstall Toolは、まだLinuxをサポートしていないため、手動でアンインストールする必要がある。
まず、インストールされている.NETのバージョンを表示する。
dotnet --list-sdks
次に、任意の.NET SDKをアンインストールする。
export SDK_VERSION="<.NET SDKのバージョン 例: 7.0.400>"; \
export DOTNET_UNINSTALL_PATH="<.NET SDKのインストールディレクトリ>"
rm -rf "$DOTNET_UNINSTALL_PATH/sdk/$SDK_VERSION"
dotnet-install.shファイルを使用してインストールしている場合、dotnetホストと共有パッケージもインストールされるが、
バージョンによっては、追加でアンインストールしなければならない場合もある。
以下の例では、.NETランタイム、および、.NET SDK(sdk、host、shared)を完全にアンインストールしている。
export RUNTIME_VERSION="<.NETランタイムのバージョン 例 : 7.0.10>"; \
export SDK_VERSION="<.NET SDKのバージョン 例 : 7.0.400>"
cd <.NET SDKのインストールディレクトリ>
rm -rf "host/fxr/$RUNTIME_VERSION"; \
rm -rf "packs/Microsoft.AspNetCore.App.Ref/$RUNTIME_VERSION"; \
rm -rf "packs/Microsoft.NETCore.App.Host.linux-x64/$RUNTIME_VERSION"; \
rm -rf "packs/Microsoft.NETCore.App.Ref/$RUNTIME_VERSION"; \
rm -rf "sdk/$SDK_VERSION"; \
rm -rf "sdk-manifests/$RUNTIME_VERSION"; \
rm -rf "shared/Microsoft.AspNetCore.All/$RUNTIME_VERSION"; \
rm -rf "shared/Microsoft.AspNetCore.App/$RUNTIME_VERSION"; \
rm -rf "shared/Microsoft.NETCore.App/$RUNTIME_VERSION"; \
rm -rf "templates/$RUNTIME_VERSION"
.NETランタイムまたは.NET SDKの設定
.NETランタイムを使用したソフトウェアを実行する場合、環境変数DOTNET_ROOT
にdotnet実行ファイルがあるディレクトリのフルパスを指定する必要がある。
既に、環境変数PATH
にdotnet実行ファイルがあるディレクトリのパスを追加している場合は、以下のように、~/.profileファイル等に追記する。
# Adding PATH environment variable
export PATH="<.NETランタイムまたは.NET SDKのインストールディレクトリ>:$PATH"
# Setting .NET Runtime or .NET SDK Directory
export DOTNET_ROOT="<.NETランタイムまたは.NET SDKのインストールディレクトリ> 例: $HOME/InstallSoftware/NET_8_SDK>"
# テレメトリを無効にする場合
export DOTNET_CLI_TELEMETRY_OPTOUT=1
# または
export DOTNET_CLI_TELEMETRY_OPTOUT=true
.NETランタイム / .NET SDKの保存場所
.NETランタイム / .NET SDKのインストールディレクトリは、dotnet --list-sdks
コマンドおよびdotnet --list-runtimes
コマンドからの出力に一覧表示される。
.NETランタイム / .NET SDKのアンインストール
.NET Core 2.1以降では、パッケージ管理システム(dnf
、apt
、zypper
等)を使用してアップグレードする場合、.NETをアンインストールする必要はない。
なぜなら、パッケージ管理システムのupdate
コマンドまたはrefresh
コマンド等では、新しいバージョンが正常にインストールされる時、古いバージョンが自動的に削除されるからである。
パッケージ管理システムを使用して.NETランタイム / .NET SDKをインストールした場合は、パッケージ管理システムを使用して.NETランタイム / .NET SDKをアンインストールする。
まず、.NET SDKと依存ファイルをアンインストールするため、以下のコマンドを実行する。
# RHEL sudo dnf remove dotnet-sdk-<バージョン> dotnet-runtime-<バージョン> sudo dnf remove libunwind libicu libuuid # SUSE sudo zypper remove dotnet-sdk-<バージョン> dotnet-runtime-<バージョン> sudo zypper remove libunwind libicu libuuid1
次に、登録したリポジトリを削除する場合は、以下のコマンドを実行する。(削除は必須ではない)
# RHEL sudo dnf remove /etc/yum.repos.d/microsoft-prod.repo # SUSE sudo zypper remove /etc/yum.repos.d/microsoft-prod.repo
GPG鍵も含めて削除する場合は、以下のコマンドを実行する。(削除は必須ではない)
# RHEL / SUSE sudo rpm -qa gpg-pubkey \* --qf "%{version}-%{release} %{summary}\n" | grep microsoft
上記の検索結果に、********-******** gpg(Microsoft (Release signing) <gpgsecurity@microsoft.com>)のようなリストが表示される。(アスタリスクの箇所がGPG鍵である)
このGPG鍵を使用して、以下のコマンドを実行する。
sudo rpm -e --allmatches gpg-pubkey-xxxxxxxx-xxxxxxxx
一時ファイルの自動生成の無効化
.NETを使用するとき、/tmpディレクトリ内にclr-debug-pipeファイル(パイプファイル)およびdotnet-diagnostic(ソケットファイル)ファイルが自動的に作成される。
これらのファイルの自動生成を抑制する場合、~/.profileファイル等に以下に示す設定を追記する。
vi ~/.profile
# ~/.profileファイル
# デバッガ、プロファイラ、EventPipeの診断を有効または無効にする
# ただし、無効にする場合、デバッグ不可能となることに注意する
# export COMPlus_EnableDiagnostics=0 # または、DOTNET_EnableDiagnostics=0
export DOTNET_Diagnostics_LogDirectory="/dev/null"
export DOTNET_Diagnostics_AutoSaveDump=false
C#プロジェクトの作成
C#_Linuxという名前の.NETコンソールプロジェクトを作成する。
- VS Codeのメインメニューから、[ファイル] - [フォルダを開く]を選択する。
- [フォルダを開く]ダイアログから、C#_Linuxディレクトリを作成して、[フォルダを選択]を選択する。
このディレクトリ名がプロジェクト名と名前空間名になる。 - VS Codeのメインメニューから、[表示] - [端末]を選択する。
- VS Codeのメイン画面下部に、[ターミナル]タブが表示される。
- [ターミナル]タブにおいて、以下のコマンドを実行する。
- 単一の.NET SDKをインストールしている場合
dotnet new console
- または
dotnet new console --output C#_Sample01
- 複数の.NET SDKをインストールしている場合
dotnet new console --framework net6.0
例. .NET 6を使用する場合- または
dotnet new console --output C#_Sample01 --framework net6.0
例. .NET 6を使用する場合
- 単一の.NET SDKをインストールしている場合
- ワークスペースから、Program.csファイルを開く。
初めて、.csファイルを開く場合、OmniSharpがエディタに読み込まれる。 - VS Codeの右下に、ソフトウェアのビルドとデバッグに不足しているアセットを追加するメッセージが表示されるため、[Yes]ボタンを選択する。
C#プロジェクトをビルドおよび実行を同時に行う場合、C#プロジェクトのディレクトリに移動して、以下のコマンドを実行する。
dotnet run --project C#_Sample01
C#プロジェクトのデバッグ
launch.json
下表に、launch.jsonファイルの設定の意味を示す。
属性 | 意味 |
---|---|
preLaunchTask | デバッグ実行前に行うタスクを指定する。 tasks.jsonファイルにある tasks のlabel 属性の値を指定。
|
program | 起動するプログラムのパスを指定する。 初期設定は、${workspaceFolder}/bin/Debug/netX.Y/<ターゲットプラットフォーム>/<C#プロジェクト名>.dll |
args | 実行ファイルに与える引数を指定する。 複数の引数を指定する場合は、カンマ(,)で区切る。 |
cwd | プログラムの実行に使用するディレクトリを指定する。 初期設定は、 ${workspaceFolder}
|
console |
デバッグ対象のプログラムを起動するコンソールの指定する。
|
internalConsoleOptions |
|
externalConsoleOptions |
|
stopAtEntry |
|
その他、下表のような属性が設定できる。
属性 | 意味 |
---|---|
env | 環境変数を指定する。 |
launchBrowser | Webアプリケーションのデバッグを行う場合、起動するWebブラウザを指定する。 |
sourceFileMap | ソースファイルのマッピングを指定する。 |
symbolPath | シンボルパスを設定する。 |
justMyCode |
|
requireExactSource | デバッグ実行しているプログラムと一致したpdbファイルおよびソースファイルを必要とする。 |
enableStepFiltering | マネージコードのプロパティおよび演算子についてもステップ実行を行う。 |
logging | 出力コンソールに出力するログの種類を指定する。 |
pipeTransport | VS Codeとデバッガのバックエンドを接続するため、リモートコンピュータに接続する必要がある場合の設定を記述する。 |
入力の許可
デバッグコンソールは、実行中のプログラムのターミナル入力を受け付けないため、ターミナル入力を許可するには、統合ターミナルまたは外部ターミナルを使用する。
まず、プロジェクトディレクトリの.vscode/launch.jsonファイルを開く。
console
を、internalConsole
から以下のように変更する。
# VS Codeの統合ターミナルを使用する場合
"console": "integratedTerminal",
# VS Codeの外部ターミナルを使用する場合
"console": "externalTerminal",
.csファイルの任意のステップにおいて、[F9]キーを押下してブレークポイントを張る。
[F5]キーを押下して、C#プロジェクトをデバッグする。
.NET SDKのバージョンを切り替える
インストールされている.NET SDKのバージョンを確認する。
dotnet --list-sdks # 出力例 5.0.403 [/usr/local/share/dotnet/sdk] 6.0.100 [/usr/local/share/dotnet/sdk]
C#のプロジェクトディレクトリに移動して、以下のコマンドを実行する。
cd /<C#等のプロジェクトディレクトリ> dotnet new globaljson --sdk-version 5.0.403
これにより、global.jsonファイルが以下の内容で作成される。
{
"sdk": {
"version": "5.0.403"
}
}
最後に、.NET SDKのバージョンが切り替わっているかどうか確認する。
dotnet --version # 出力例 5.0.403
C#プロジェクトのリリース
単一のTFM
C#のcsproj拡張子のファイルが存在するディレクトリにおいて、以下のコマンドを実行する。
dotnet publish -c:Release -r:<ターゲットプラットフォーム> -p:PublishReadyToRun=<trueまたはfalse> -p:PublishSingleFile=<trueまたはfalse> --self-contained:<trueまたはfalse>
以下の例では、Linux x64向けとPinePhone向けにリリースビルドしている。
# Linux x64向け dotnet publish -c:Release -r:linux-x64 -p:PublishReadyToRun=false -p:PublishSingleFile=true --self-contained false # Linux Arch64向け (PinePhone、Raspberry Pi等) dotnet publish -c:Release -r:linux-arm64 -p:PublishReadyToRun=false -p:PublishSingleFile=true --self-contained false # Linux Arch64向け TFMの指定 dotnet publish -c:Release -r:linux-arm64 -p:PublishReadyToRun=false -p:PublishSingleFile=true --self-contained false -f:<.NETのターゲットフレームワークのバージョン 例: net8.0>
以下に、各オプションの意味を記載する。
-c:Release
- リリースビルド
-c Release
オプションは不要である。- このオプションは、ソフトウェアのリリースビルドを公開することを明示するために提供されている。
- .NET Core SDK 3.1以降を使用する場合、
dotnet publish
コマンドを実行する時の既定の公開モードは、フレームワークに依存する実行可能ファイルである。
-r:<ターゲットプラットフォーム>
- ターゲットプラットフォームは以下の通りである。
- win-x64 … ターゲットをWindows x64にする。
- win-x86 … ターゲットをWindows x86にする。
- win-arm64 … ターゲットをWindows AArch64にする。
- linux-x64 … ターゲットをLinux x64にする。
- linux-x86 … ターゲットをLinux x86にする。
- linux-musl-x64 … ターゲットをAlpine Linuxのようなmuslを使用した軽量ディストリビューションにする。
- linux-arm64 … ターゲットをLinux AArch64にする。
- linux-arm … ターゲットをLinux Arm32にする。
- linux-musl-arm64 … ターゲットをAArch64 Arm v8向けDockerイメージおよび最小限のベースイメージの構築に使用にする。
- linux-bionic-arm64 … ターゲットをAndroidのbionic libcを使用したLinuxディストリビューションにする。 例: Termux
- osx-arm64 … ターゲットをMacOS AArch64にする。
- osx-x64 … ターゲットをMacOS x64にする。
- android-arm64 … ターゲットをAndroidにする。
- ios-arm64 … ターゲットをiPhoneにする。
- ターゲットプラットフォームは以下の通りである。
-p:PublishReadyToRun=true
- 事前コンパイル方式にする。
- 初回から起動速度が速くなる。ただし、ファイルサイズが少し大きくなる。
-p:PublishSingleFile=true
(推奨)- 出力ファイルを1つの実行ファイルにまとめる。
- ただし、.NET 5以降では、単一の実行ファイルにする場合、使用できないAPIや動作が変化するAPIが存在する。(Assemblyのパスが取得できない等)
- 代替手段も存在するため、以下に示すMicrosoftの公式Webサイトを参照すること。
- https://docs.microsoft.com/ja-jp/dotnet/core/deploying/single-file#api-incompatibility
--self-contained false
(推奨)- .NETランタイムを含めた単一の実行ファイルを生成する。
- 実行環境に.NETランタイムがインストールされている必要がない。
- -p:PublishTrimmed=true
- 使用していない依存関係を削除する。
- アプリケーションサイズを削減できる。
- -p:IncludeNativeLibrariesForSelfExtract=true
- ネイティブライブラリ (libHarfBuzzSharp.soやlibSkiaSharp.so等) を実行ファイルに組み込む。
- 実行時に自動的に展開される。
※注意
PublishTrimmedオプションを使用する場合、リフレクションを使用しているコードに影響が出る可能性がある。
ただし、生成されるファイルサイズは大きくなるが、単一の実行ファイルで完結する。
SkiaSharpのような特殊なネイティブライブラリを使用している場合は、追加の設定が必要になることがある。
リリースビルドする実行ファイルにデバッグ情報を付加しない場合は、プロジェクトファイル(.csproj拡張子)ファイルに以下の設定を追記する。(推奨)
<PropertyGroup>
<!-- ...略 -->
<DebugType Condition="'$(Configuration)' == 'Release'">none</DebugType>
<!-- ...略 -->
</PropertyGroup>
また、プロジェクトファイル(.csproj拡張子)を編集して、発行を指定することもできる。
これらのプロパティには、以下に示すエレメントがある。
- PublishSingleFile
- 単一ファイルの発行を有効にする。
- また、
dotnet build
コマンド実行時の単一ファイルの警告を有効にする。
- SelfContained
- 発行するプロジェクトが自己完結型またはフレームワーク依存であるかを判断する。
- 自己完結型としてソフトウェアを発行する時、プラットフォーム固有の実行可能ファイルが生成される。
- 出力されるpublishディレクトリには、.NETライブラリやターゲットランタイム等のソフトウェアの全てのコンポーネントが格納される。
- この時、発行したソフトウェアは、他の.NETから分離されており、ローカルにインストールされた共有ランタイムを使用しない。
- そのため、発行したソフトウェアを使用するユーザは、.NETのダウンロードおよびインストールを行うことは不要となる。
- RuntimeIdentifier
- ターゲットとするOSとアーキテクチャの種類を指定する。
- デフォルトでは、
<SelfContained>true</SelfContained>
が設定される。 - 単一ファイルのプロジェクトは、常にOSとアーキテクチャに固有である。
- 複数のOSおよびアーキテクチャを発行する場合は、
linux-x64
、linux-arm64
、win10-x64
等、構成ごとに発行する必要がある。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<PublishSingleFile>true</PublishSingleFile>
<SelfContained>true</SelfContained>
<RuntimeIdentifier>linux-arm64</RuntimeIdentifier>
</PropertyGroup>
</Project>
また、VS Codeで開発する場合、C#プロジェクトの.vscodeディレクトリにtasks.jsonファイルを作成して、以下の設定を追加してもよい。
[Ctrl] + [P]キーを同時押下してコマンドパレットを開いて、"task Debug"または"task Relese"と入力することにより、
デバッグビルドまたはリリースビルドすることができるようになる。
// tasks.json
"version": "〜",
"tasks": [
// ...略
// リリースビルド
{
"label": "Release",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"-c:Release",
"-r:<ターゲットプラットフォーム 例. linux-x64等>",
"-p:PublishReadyToRun=false",
"-p:PublishSingleFile=true",
"--self-contained:false",
"${workspaceFolder}/<C#プロジェクトのファイル名(.csprojファイル)>",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary",
],
"problemMatcher": "$msCompile"
},
// デバッグビルド
{
"label": "Debug",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"-c:Debug",
"-r:<ターゲットプラットフォーム>",
"-p:PublishReadyToRun=false",
"-p:PublishSingleFile=true",
"--self-contained:false",
"${workspaceFolder}/<C#プロジェクトのファイル名(.csprojファイル)>",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary",
],
"problemMatcher": "$msCompile"
},
// ...略
]
複数のTFM
複数のTFMを指定するプロジェクトをpulishする場合、標準のpublishコマンドでは失敗するが、
マルチターゲットを実行するカスタムターゲットを作成することができる。
これを行うには、ソリューションディレクトリ下にDirectory.Build.propsファイル、または、Directory.Build.targetsファイルを作成する。
vi Directory.Build.props または vi Directory.Build.targets
<!--
Directory.Build.propsファイル または Directory.Build.targetsファイル
-->
<Project>
<Target Name="PublishProjectIfFrameworkSet"
DependsOnTargets="Publish"
Condition=" '$(TargetFramework)' != '' " />
<Target Name="PublishProjectForAllFrameworksIfFrameworkUnset" Condition=" '$(TargetFramework)' == '' ">
<ItemGroup>
<_PublishFramework Include="$(TargetFrameworks)" />
</ItemGroup>
<MSBuild Projects="$(MSBuildProjectFile)" Targets="Publish" Properties="TargetFramework=%(_PublishFramework.Identity)" />
</Target>
<Target Name="PublishAll"
DependsOnTargets="PublishProjectIfFrameworkSet;PublishProjectForAllFrameworksIfFrameworkUnset" />
</Project>
ソリューションディレクトリ下で以下に示すコマンドを実行することにより、定義された全ての.NETを使用してビルドすることができる。
dotnet msbuild /t:PublishAll /p:Configuration=Release
プロジェクトのターゲッットフレームワークの指定
ターゲットフレームワークは、プロジェクトファイルで指定する。
単一のターゲットフレームワークを指定する場合、プロジェクトファイル (.csprojファイル) のTargetFramework
エレメントに記述する。
以下の例では、ターゲットを.NET 6に変更している。
.csprojファイル
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
</Project>
複数のターゲットを指定する場合、プロジェクトファイル(.csproj)のTargetFrameworks
エレメントにセミコロン(;
)で囲んで記述する。
以下の例では、ターゲットを.NET Core 3.1、.NET 6、.NET 7に変更している。
.csprojファイル
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp3.1;net6.0;net7.0</TargetFrameworks>
</PropertyGroup>
</Project>
また、各ターゲットフレームワークのアセンブリを条件付きで参照することができる。
if-elif-else
プリプロセッサを使用して、それらのアセンブリに対して条件付きでコンパイルすることもできる。
以下の例では、.NET 6、.NET Standard 2.1、.NET Framework 4.8のAPIをターゲットとしている。
複数の.NET TFM向けにコンパイルする場合、Condition
属性には、実装固有のパッケージを含めることができる。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.1;net6.0;net48</TargetFrameworks>
</PropertyGroup>
<!-- Conditionally obtain references for the .NET Framework 6.0 target -->
<ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
<Reference Include="System.Net" />
</ItemGroup>
<!-- Conditionally obtain references for the .NET Framework 4.8 target -->
<ItemGroup Condition=" '$(TargetFramework)' == 'net48' ">
<Reference Include="System.Net.Http" />
<Reference Include="System.Threading.Tasks" />
</ItemGroup>
</Project>
public class MyClass
{
static void Main()
{
#if NET48
Console.WriteLine("Target framework: .NET Framework 4.8");
#elif NETSTANDARD2_1
Console.WriteLine("Target framework: .NET Standard 2.1");
#elif NET60
Console.WriteLine("Target framework: .NET 6.0");
#else
Console.WriteLine("Target framework: etc");
#endif
}
}
サポートされるターゲットフレームワークのバージョンを表すプリプロセッサを、下表に示す。
.NET Standard、.NET Core、.NET 5以降のTFMを表すプリプロセッサを使用する場合、ドットおよびハイフンをアンダースコアに置き換え、小文字を大文字に変更する。
(例えば、netstandard 2.1のプリプロセッサは、NETSTANDARD2_1
)
これらのプリプロセッサは、DisableImplicitFrameworkDefines
プロパティで無効にすることができる。
DisableImplicitFrameworkDefines
プロパティの詳細を知りたい場合は、Microsoftの公式Webサイトを参照すること。
ターゲットフレームワーク | プリプロセッサ | その他.NET 5以降で使用できるプリプロセッサ |
---|---|---|
.NET 5以降 および .NET Core | NET NET7_0 NET6_0 NET5_0 NETCOREAPP NETCOREAPP3_1 NETCOREAPP3_0 NETCOREAPP2_2 NETCOREAPP2_1 NETCOREAPP2_0 NETCOREAPP1_1 NETCOREAPP1_0 |
NET7_0_OR_GREATER NET6_0_OR_GREATER NET5_0_OR_GREATER NETCOREAPP3_1_OR_GREATER NETCOREAPP3_0_OR_GREATER NETCOREAPP2_2_OR_GREATER NETCOREAPP2_1_OR_GREATER NETCOREAPP2_0_OR_GREATER NETCOREAPP1_1_OR_GREATER NETCOREAPP1_0_OR_GREATER |
.NET Standard | NETSTANDARD NETSTANDARD2_1 NETSTANDARD2_0 NETSTANDARD1_6 NETSTANDARD1_5 NETSTANDARD1_4 NETSTANDARD1_3 NETSTANDARD1_2 NETSTANDARD1_1 NETSTANDARD1_0 |
NETSTANDARD2_1_OR_GREATER NETSTANDARD2_0_OR_GREATER NETSTANDARD1_6_OR_GREATER NETSTANDARD1_5_OR_GREATER NETSTANDARD1_4_OR_GREATER NETSTANDARD1_3_OR_GREATER NETSTANDARD1_2_OR_GREATER NETSTANDARD1_1_OR_GREATER NETSTANDARD1_0_OR_GREATER |
.NET Framework | NETFRAMEWORK NET48 NET472 NET471 NET47 NET462 NET461 NET46 NET452 NET451 NET45 NET40 NET35 NET20 |
NET48_OR_GREATER NET472_OR_GREATER NET471_OR_GREATER NET47_OR_GREATER NET462_OR_GREATER NET461_OR_GREATER NET46_OR_GREATER NET452_OR_GREATER NET451_OR_GREATER NET45_OR_GREATER NET40_OR_GREATER NET35_OR_GREATER NET20_OR_GREATER |
ターゲットフレームワークは、通常、ターゲットフレームワークモニカー(TFM)により参照される。
下表に、.NET SDKおよびNuGetクライアントによってサポートされるターゲットフレームワークを示す。
同等のものが括弧内に示されている。 例えば、win81はnetcore451と同等のTFMである。
対象とする Framework | TFM |
---|---|
.NET 5以降および.NET Core | netcoreapp1.0 netcoreapp1.1 netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1 net5.0 net6.0 net7.0 |
.NET Standard | netstandard1.0 netstandard1.1 netstandard1.2 netstandard1.3 netstandard1.4 netstandard1.5 netstandard1.6 netstandard2.0 netstandard2.1 |
.NET Framework | net11 net20 net35 net40 net403 net45 net451 net452 net46 net461 net462 net47 net471 net472 net48 |
ユニバーサルWindowsプラットフォーム | uap (uap10.0) uap10.0 (win10) (netcore50) |
.NET Micro Framework | netmf |
Windowsストア | netcore (netcore45) netcore45 (win) (win8) netcore451 (win81) |
TFMの詳細は、Microsoftの公式Webサイトを参照すること。
.NET 8の変更点
.NET 8では、いくつかのアーキテクチャに関する重要な変更が導入された。
特に、Linux環境での動作に影響を与える変更がある。
- ネイティブAOT (Ahead-of-Time) コンパイルのサポートが強化されて、プラットフォーム固有の最適化がより重視された。
- クロスプラットフォームビルドの処理方法が改善されて、より厳密なプラットフォームチェックが導入された。
AnyCPUの扱いの変更
- .NET 7以前
- AnyCPUは、実行時に適切なプラットフォームを動的に選択される。
- .NET 8以降
- 特にLinux環境では、より明示的なプラットフォーム指定が必要になるケースが増加した。
AnyCPUの取り扱いは、以下に示す目的で導入された。
- より効率的なネイティブコード生成
- プラットフォーム固有の最適化の改善
- セキュリティとパフォーマンスの向上
- クロスプラットフォームビルドの信頼性向上
ただし、この動作は環境やプロジェクトの設定によって異なる場合がある。
特にLinux環境では、システムのアーキテクチャとの互換性をより明示的に指定する必要がある。
.NET 8以降では、プラットフォームの選択において、AnyCPUではなくアーキテクチャあるいはターゲットプラットフォームを指定することが推奨される。
<!-- 方法1: 明示的にx64を指定 -->
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<!-- 方法2: ターゲットプラットフォームを指定 -->
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
</PropertyGroup>
VS Codeの拡張機能
VS Codeでは、拡張機能をインストールすることにより、C#の機能を強化することができる。
C#の開発におけるVS Codeの拡張機能を以下に示す。
- C#
- この拡張機能は、シンタックスハイライティング、インテリセンス、定義への移動、すべての参照の検索などを追加します。また、C#アプリケーションのデバッグをサポートします。
- デバッグについては、.NET Coreデバッガの設定方法を参照することを推奨する。
- C# Extensions
- C#のクラスやインターフェースを簡単に追加できる機能である。
- この拡張機能は、クラスやインターフェイスのための新しいファイルの作成およびプロジェクトの名前空間を設定等を自動で行う。
- C# Snippets
- C#のコードスニペットを多数収録している。
- C# XML Documentation Comments
- ソースコードにXMLコメントを追加する時、より快適な操作性を実現する機能である。
ASP.NET Coreの開発におけるVS Codeの拡張機能を以下に示す。
- ASP.NET Core Snippets
- ASP.NET Coreのコントローラやアクションを簡単に構築するためのスニペットを収録している。
- WilderMinds社のASP.NET Core Snippets
- ASP.NET Core Snippetsの代わりに、よく似たスニペットセットを収録している。
- ASP.NET Helper
- Razorのビューページ内にIntellisenseを追加する。
- HTML Snippets
- HTMLスニペットに加えて、HTMLシンタックスハイライトのサポートを追加する。
- ちなみに、VS CodeにはEmmetが内蔵されており、HTMLのコーディングが非常に速くなる。
- IntelliSense for CSS class names
- プロジェクト内のCSSクラス定義に基づいて、HTMLのclass属性にCSSクラス名を補完する。
その他
- Git Extension Pack
- Gitにおける5つの拡張機能をインストールする拡張機能である。