Q&A
.NETアプリケーションを扱っているとよく聞かれるインストールや更新などについての質問と回答をざっくりまとめています。(CopilotなりChatGPTに聞いたほうが早いのですが。)
インストールとメンテナンス
Q: .NET Frameworkと.NETは共存できる?
A: できる。これらはまったく別の製品。共存させて互いに影響することもない。
Q: 複数バージョンの.NET Frameworkで共存できる?
A:
- .NET Framework 3.5と.NET Framework 4以降は可能。
- .NET Frmaeowrk 4以降のバージョン同士では共存できない。例えば4.7.2と4.8の共存は不可能。新しいバージョンに置き換えられる。古いバージョン向けのアプリは新しいバージョン上で動作する。
Q: 複数バージョンの.NETで共存できる?
A: できる。
Q: .NETの新しいバージョンをインストールしたら古いバージョンはアンインストールできる?
A:
- アンインストールしてはいけない。.NETはメジャーバージョン間で互換性がないので、古いバージョンを使用するアプリは新しいバージョン上では動作しない。
- 例えば.NET 6で動作するアプリがあるとき、.NET 8をインストールしてもそのアプリは.NET 8上では動作せず.NET 6を必要とする。.NET 6をアンインストールするとアプリが動作しなくなる。
- メジャーバージョンのロールフォワードの構成をしておけば、新しいバージョンがインストールされたときにそのバージョン上で動作させることは可能。ただし互換性に注意する必要があり扱いが難しい。
Q: アップグレード後に再起動は必要?
A: ファイルが使用中の場合は再起動が必要になる可能性がある。
Q: アップグレード後の再起動を無視したらどうなる?
A: 基本的には動作するはずだが、一部のファイルやレジストリは置き換わっていない状態になっているので、新しいバージョンの動作となる可能性がある。
Q: .NET Frameworkはアンインストールできる?
A: Windowsに既定でインストールされているバージョンはアンインストールできない。 追加でインストールしたものはアンインストールできる。Windowsの更新プログラム扱いなので、対応する更新プログラムをアンインストールする。(https://jpdscore.github.io/blog/dotnet/ndp-upgrade-and-downgrade/)
Q: .NET Frameworkは修復インストールできる?
A: 修復インストールではないが、Windowsの機能や修復ツールが使える。(https://jpdscore.github.io/blog/dotnet/netfx-how-to-repair/)
Q: NGEN(ngen.exe, ngentask.exe, mscorsvw.exe)でCPU使用率が高くなる。無効にできる?
A: できない。Windows Updateで自動的に有効になる。
Q: NGENは何故必要?
A:
- .NET FrameworkのアセンブリはCPUが直接実行できないプラットフォーム非依存の中間言語で構成されている。
- 実行時にJust-in-Time(JIT)でコンパイルされるので、はじめてアセンブリの処理が実行されるときに時間がかかる&CPU負荷がかかる。
- NGENにより予めコンパイルしておくことでJITコンパイルのデメリットを解消できる。
Q: NGENはいつ動作する?
A:
- .NET Frameworkの更新プログラムをインストールしたり、アプリをインストールした場合にキューに登録される。
- 主要なランタイムは直ちにNGENされるが、それ以外はアイドル時にNGENされるので、いつ実行され完了するのか正確に予測はできない。
- 以下のコマンドを管理者権限で実行することでキューを直ちに完了させることはできる。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe executeQueuedItems
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe executeQueuedItems
- [ARM64環境のみ]
C:\Windows\Microsoft.NET\FrameworkArm64\v4.0.30319\ngen executeQueuedItems
ランタイム
Q: AnyCPU はどのように動作する?
A: アプリを実行する環境によってアーキテクチャが選択されて実行される。
ターゲットアーキテクチャと選択されるアーキテクチャの関係
ターゲットアーキテクチャ | x86優先 | ARM64優先 | コンピューターのアーキテクチャ | 実行時に選択されるアーキテクチャ |
---|---|---|---|---|
x86 | - | - | x86 | x86 |
x86 | - | - | x64 | x86 (WOW64) |
x86 | - | - | ARM64 | x86 (エミュレーション) |
x64 | - | - | x86 | 実行できない |
x64 | - | - | x64 | x64 |
x64 | - | - | ARM64 | x64 (エミュレーション) |
ARM64 | - | - | x86 | 実行できない |
ARM64 | - | - | x64 | 実行できない |
ARM64 | - | - | ARM64 | ARM64 |
AnyCPU | No | No | x86 | x86 |
AnyCPU | No | No | x64 | x64 |
AnyCPU | No | No | ARM64 | x64 |
AnyCPU | Yes | - | x86 | x86 |
AnyCPU | Yes | - | x64 | x86 |
AnyCPU | Yes | - | ARM64 | x86 |
AnyCPU | - | Yes | x86 | x86 |
AnyCPU | - | Yes | x64 | x64 |
AnyCPU | - | Yes | ARM64 | ARM64 |