Day After Day
tsurezure naru mamani...
ANOTHER DECADE

from 2022 when it's begining after/with CORONA Virus.

Microsoft .NET のバージョンに注意

3月
4
2025
Back
Alt+HOME


これまで、.NET 8.0 でコンパイルした C# のプログラムが問題なく動いてきた。.NET 9.0 にアップデートなる記事に触発され何気なくやってみた結果ひどい結果になってしまった記録

 .NET 9.0をインストールするのはそれほど難解な事ではないので、今回はその後の顛末を書くこととする。
 プログラム本体と専用のDLLの主な一部を .NET 9.0 でコンパイルしてみた。さしてエラーも出ずに終了したのでラッキーということで、実際に使ってテストしていた。 ところが今までできていた事が、出来たり出来なかったり挙動がおかしいことに、しばらくして気がついた。
 .NET 8.0 でコンパイルし直してテストしたり、組み合わせを変えてやってみたり、こういうのをドツボに嵌まると言う。 埒が明かないので、ChatGPTに聞きながらやってみることにした。(ほぼ、ChatGPTの答えによる)

.NET 8.0 のような偶数バージョンと奇数バージョンの違い


グーグルで「.NET 偶数バージョンと奇数バージョン」と言うキーワードで検索すると、AI(多分Gemini)が次のように答える。

.NET の偶数バージョンは標準期間サポート(STS)リリース、奇数バージョンは長期サポート(LTS)リリースと呼ばれ、サポート期間が異なります。
【サポート期間】
STS リリース:偶数年にリリースされ、リリースから18カ月間の無料サポートとパッチが提供されます
LTS リリース:奇数年にリリースされ、リリースから3年間の無料サポートと修正プログラムが提供されます

    ちょっと分かり辛いのだが、「奇数バージョンは長期サポート」と記されている。 つまりこの答えに示されている奇数の意味は奇数年にリリースされるという意味である。 私の質問は奇数バージョンつまり.NET 9.0の事を聞いているつもりである。実は .NET 9.0 は 2024年11月12日リリースであり、この答えに合わせると偶数バージョンである。

    と言うことで、やはり Microsoft の公式サイトを見てみると(図をクリック)
    C#による開発を始めた当初は .NET 6 であった。間もなく .NET 8 に移行したが何の問題も無く移行できた。 多分、長期サポートの偶数バージョン(奇数年バージョン)を追っかけていくのが我々の様なノンプロには良いような気がする。

.NET 9 を完全に .NET 8 の環境に戻す


初期段階でやったこと

  1. .NET 9.0 のアンインストール

  2. PowerShell 7.5.0
    PS C:\> winget uninstall Microsoft.DotNet.SDK.9
    PS C:\> winget uninstall Microsoft.DotNet.Runtime.9
    PS C:\> winget uninstall Microsoft.AspNetCore.App.9
  3. dotnet フォルダから 9.0 を削除する

  4. 1. C:\Program Files\dotnet\sdk フォルダを開く。
    2. 9.0.x フォルダが有れば、手動で削除する。
    3. C:\Program Files\dotnet\shared\ の中の各フォルダ内の 9.0.x も削除する。
    4. ゴミ箱も空にする。

  5. .csproj の内容をチェック

  6. Visual Studio Code
    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>		→ ここが net9.0 になっていなければOK
        <RootNamespace>_62394</RootNamespace>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
      </PropertyGroup>
    
    </Project>

  7. 確認作業

  8. 1. [Win] + [r] → [詳細設定] → [環境変数] にて Path の確認 2. 正しく .NET 8.0 に設定されているか確認

    PowerShell 7.5.0
    PS C:\> dotnet --version


コンパイルし直して運用してみた結果

全く状況が改善していない事が判明したのでもう一度最初から細かく見直すことに。ここからは ChatGPT の回答をそのまま掲載する。

  1. ビルドキャッシュの影響

  2. dotnet のビルドシステムは、一度ビルドした成果物をキャッシュしている可能性があります。
    対策 dotnet clean
    dotnet build --no-incremental
    dotnet clean でキャッシュを削除し、--no-incremental をつけてフルビルドを試してください。

  3. NuGet パッケージのバージョンがズレた

  4. dotnet 9.0 を入れた際に、一部のパッケージがアップグレードされ、8.0 に戻した際に期待通りにダウングレードされていない可能性があります。
    対策: dotnet nuget locals all --clear
    dotnet restore
    dotnet clean でキャッシュを削除し、--no-incremental をつけてフルビルドを試してください。

  5. プロジェクトやソリューションの設定が変わった

  6. dotnet 9.0 で csproj に何か変更が加えられた可能性があります。
    対策: ・csproj の TargetFramework が 本当に net8.0 に戻っているか 確認
    ・global.json がある場合、sdk.version が 8.0 に設定されているか 確認
    ・csproj や .sln ファイルを git diff などで確認し、余計な変更が加わっていないかチェック
    dotnet clean でキャッシュを削除し、--no-incremental をつけてフルビルドを試してください。

  7. 一部の .dll が古いまま残っている

  8. bin や obj フォルダ内のビルド成果物が壊れている可能性があります。
    対策: rm -rf bin obj
    dotnet build
    又は Remove-Item -Recurse -Force bin, obj
    dotnet build

  9. 環境変数やシステム設定が変わった

  10. dotnet 9.0 をインストールした際に、環境変数や .NET Runtime の設定が変更された可能性があります。
    対策: 1. dotnet --info を実行し、正しく 8.0 が選ばれているか確認
    2. 環境変数 DOTNET_ROOT や PATH に 9.0 の影響が残っていないか 確認
    3. dotnet --list-sdks で 使用中の SDK バージョン をチェック
    dotnet clean でキャッシュを削除し、--no-incremental をつけてフルビルドを試してください。

  11. 9.0 を完全にアンインストール

  12. どうしても 9.0 が影響する場合、以下の方法で .NET 9.0 を完全に削除 できます。
    1. .NET 9.0 SDK のアンインストール Get-ChildItem "C:\Program Files\dotnet\sdk" | Select-String "9.0" | ForEach-Object { Remove-Item -Recurse -Force $_.Path } 2. .NET 9.0 Runtime も削除 Get-ChildItem "C:\Program Files\dotnet\shared" | Select-String "9.0" | ForEach-Object { Remove-Item -Recurse -Force $_.Path } 3. 環境変数や Path を再確認
    4. PC を再起動

    残念ながらこれらのコマンドはうまく行かなかったので、Visual Studio のインストーラを起ち上げ .NET 9.0 のチェックを外し再インストールすることで削除できた。

  13. おかしい動作のパターンを特定

  14. 「動作が不安定」ということですが、以下の点を整理すると原因が特定しやすくなります。
    ・100% 再現する? それとも ランダムに発生する?
    ・特定の機能だけが壊れる? それとも 全体的におかしい?
    ・エラーメッセージは出る? (dotnet run で確認)
    ・以前と違うライブラリを使っている? (dotnet list package でチェック)
    ・ファイルや設定が意図せず変更されていない? (git diff で確認)



    Back
    Alt+HOME