インストール - .NET SDK

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

.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.3026.0.423
      .NET 5以降で使用できる。

  • -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以降では、パッケージ管理システム(dnfaptzypper等)を使用してアップグレードする場合、.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コンソールプロジェクトを作成する。

  1. VS Codeのメインメニューから、[ファイル] - [フォルダを開く]を選択する。
  2. [フォルダを開く]ダイアログから、C#_Linuxディレクトリを作成して、[フォルダを選択]を選択する。
    このディレクトリ名がプロジェクト名と名前空間名になる。
  3. VS Codeのメインメニューから、[表示] - [端末]を選択する。
  4. VS Codeのメイン画面下部に、[ターミナル]タブが表示される。
  5. [ターミナル]タブにおいて、以下のコマンドを実行する。
    • 単一の.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を使用する場合
  6. ワークスペースから、Program.csファイルを開く。
    初めて、.csファイルを開く場合、OmniSharpがエディタに読み込まれる。
  7. VS Codeの右下に、ソフトウェアのビルドとデバッグに不足しているアセットを追加するメッセージが表示されるため、[Yes]ボタンを選択する。


C#プロジェクトをビルドおよび実行を同時に行う場合、C#プロジェクトのディレクトリに移動して、以下のコマンドを実行する。

dotnet run --project C#_Sample01



C#プロジェクトのデバッグ

launch.json

下表に、launch.jsonファイルの設定の意味を示す。

属性 意味
preLaunchTask デバッグ実行前に行うタスクを指定する。
tasks.jsonファイルにあるtaskslabel属性の値を指定。
program 起動するプログラムのパスを指定する。
初期設定は、${workspaceFolder}/bin/Debug/netX.Y/<ターゲットプラットフォーム>/<C#プロジェクト名>.dll
args 実行ファイルに与える引数を指定する。
複数の引数を指定する場合は、カンマ(,)で区切る。
cwd プログラムの実行に使用するディレクトリを指定する。
初期設定は、${workspaceFolder}
console

デバッグ対象のプログラムを起動するコンソールの指定する。

  • internalConsole (デフォルト)
    VS Codeのデバッグコンソールを使用する。
  • externalTerminal
    ユーザが指定したターミナルを使用する。
  • integratedTerminal
    [ターミナル]パネルを使用する。
internalConsoleOptions
  • openOnFirstSessionStart (デフォルト)
    初回のデバッグセッション開始時のみデバッグコンソールを開く。
    その後は開いたコンソールが再利用される。
  • openOnSessionStart
    デバッグセッションが開始されるごとにデバッグコンソールを新規に開く。
  • neverOpen
    入力を許可する。(Console.Readlineメソッドを使用する場合等)
    また、デバッグコンソールを一切表示しない。
externalConsoleOptions

console属性がexternalTerminalの場合、設定が有効になる。

  • openOnFirstSessionStart (デフォルト)
    初回のデバッグセッション開始時のみデバッグコンソールを開く。
    その後は開いたコンソールが再利用される。
  • openOnSessionStart
    デバッグセッションが開始されるごとにデバッグコンソールを新規に開く。
  • neverOpen
    入力を許可する。(Console.Readlineメソッドを使用する場合等)
    また、デバッグコンソールを一切表示しない。
stopAtEntry
  • true
    プログラムをデバッグする場合、エントリポイントでデバッグを一時停止する。
    (プログラムの起動直後にデバッグ実行を中断する)


その他、下表のような属性が設定できる。

属性 意味
env 環境変数を指定する。
launchBrowser Webアプリケーションのデバッグを行う場合、起動するWebブラウザを指定する。
sourceFileMap ソースファイルのマッピングを指定する。
symbolPath シンボルパスを設定する。
justMyCode
  • true (デフォルト)
    設計者の記述したコードのみデバッグする。
  • false
    外部ライブラリも含めてデバッグする。
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-x64linux-arm64win10-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つの拡張機能をインストールする拡張機能である。