先週Windows11のVisual Studio 2022を最新バージョン(17.2.4)にアップデートしたら、Blazor WebAsssemblyのアプリケーションをPublishするときに以下のようなエラーが出るようになってしまいました。

PS C:\Users\ichiro\Projects\MyApp> dotnet publish -c Release
.....
(略)
.....
Optimizing dotnet.wasm ...
  Compressing Blazor WebAssembly publish artifacts. This may take a while...
C:\Program Files\dotnet\sdk\6.0.301\Sdks\Microsoft.NET.Sdk.BlazorWebAssembly\targets\Microsoft.NET.Sdk.BlazorWebAssembly.6_0.targets(614,5): error MSB6006: "C:\Program Files\dotnet" はコード 1 を伴って終了しました。 [C:\Users\ichiro\Projects\MyApp\MyApp\MyApp.csproj]

以上のように「Compressing Blazor WebAssembly publish artifacts.」のところでエラー止まってしまいます。

おそらく.NET SDKのバグと思われるので、しばらく経てば修正されるはずですが、急ぎの場合は何とかしないとなりません。そこで、今回は暫定的にでも解決する方法を、今後同様の事態になったときのためにまとめておきます。

ちなみに、Visual Studio 2022を再インストールしてもエラーの症状は変わりませんでした。また、Community版の旧バージョン(17.0など)をインストールする方法は見つけられなかったです。

解決方法

今回は使用する「.NET SDK」のバージョンを1つ前のものに指定したら解決しました(6.0.301 -> 6.0.300)。

手順

1. インストールされている.NET SDKのバージョン確認

以下のように確認すると、最新のバージョン(ここでは6.0.301)しかインストールされていないので、次の手順で1つ前のバージョンをインストールします。

PS C:\Users\ichiro\Projects\MyApp> dotnet --list-sdks
6.0.301 [C:\Program Files\dotnet\sdk]

2. 1つ前のバージョンの.NET SDKのインストール

.NET SDKの以下のサイトからダウンロードできます。

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

今回は「.NET 6.0」を使用しているので、以下のサイトからダウンロードします。

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

このサイトから以下のように「SDK 6.0.300」を探してダウンロードします(今回はWindowsのx64をダウンロードしました)。

インストーラーを実行して以下のような画面に従いインストールします。

3. 追加した.NET SDKを確認

1.と同じコマンドを実行すると、以下のように「6.0.300」が追加されたのが確認できます。

PS C:\Users\ichiro\Projects\MyApp> dotnet --list-sdks
6.0.300 [C:\Program Files\dotnet\sdk]
6.0.301 [C:\Program Files\dotnet\sdk]

4. 使用するSDKのバージョン指定

プロジェクトのルートフォルダー(ここでは、C:\Users\ichiro\Projects\MyApp)にglobal.jsonというファイルを作成し、以下の内容を書き込み保存します。

{
  "sdk": {
    "version": "6.0.300"
  }
}

このようにglobal.jsonにより、.NETのコマンドラインで使うSDKのバージョンを指定できます。詳しくは以下のサイトを参照してください。

https://docs.microsoft.com/ja-jp/dotnet/core/tools/global-json

5. アプリケーションのpublishの再実行

これで再度publishを実行すれば、今度は正常にできていた1つ前のSDK「6.0.300」でpublishが行われ無事に実行できました。

修正されたSDKがリリースされたら、global.jsonは削除します。