C#
.NET
VisualStudio
.NETFramework

エラー CS8357 指定されたバージョン文字列にワイルドカードが含まれていますが、これは決定性と相容れません。バージョン文字列からワイルドカードを削除するか、このコンパイルで決定性を無効にします


はじめに

Visual Studio をバージョン15.8.1あたりに上げてから、タイトルのようなエラーが発生してしまうようになり、困っていたところ、解決策が見つかりましたのでシェアします。

ちなみに、英語でのエラーメッセージは "The specified version string contains wildcards, which are not compatible with determinism. Either remove wildcards from the version string, or disable determinism for this compilation" です。

image.png

image.png


原因

アセンブリのバージョン指定にワイルドカード(ビルドごとに自動採番させる)を使用していると発生します(私はとても重宝していたのですが...)

「『決定論的』なビルド」なるものが既定で有効化されたためのようで、「決定論的」とするとテスト実行が高速化されたりする利点があったりするようです。しかし、反面今回のような影響もでてしまいます。

「.NET Core を使っていると決定論的ビルドが既定で有効化される」との情報も見つかりますが、.NET Framework でプロジェクトを生成してもこの現象は発生します。内部で.NET Coreを使用しているのかな...


対処法

(以下は、C# Windowsフォームアプリケーション(.NET Framework)のプロジェクトを作成して試しています)

ファイル "<プロジェクト名>.csproj" を直接開き、要素内にある要素の値がtrueになっているので、これをfalseに書き換えて保存します。

image.png

csprojファイル更新後、プロジェクトエクスプローラーで「(利用不可)」と表示された場合、まずは落ち着いて、プロジェクト項目を右クリックして「プロジェクトの再読み込み」を選択すると、通常どおりに読み込まれて開発作業ができるようになります。

image.png

cscやmsbuildのコンパイルオプションでも、決定論的ビルドを使用するか否かを指定できるようです(Visual Studio でビルドする際、csprojファイルで結局はコンパイルオプションを指定しているのでしょう)


おわりに

Visual Studio の進化が最近著しくて嬉しい一方、アップデートしてから不明なコンパイルエラーになったりすることもあります。当たり前ですが、納期が近い時にツール類のアップデートは控えることが賢明ですね。


参考情報