#はじめに
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" です。
#原因
アセンブリのバージョン指定にワイルドカード(ビルドごとに自動採番させる)を使用していると発生します(私はとても重宝していたのですが...)
「『決定論的』なビルド」なるものが既定で有効化されたためのようで、「決定論的」とするとテスト実行が高速化されたりする利点があったりするようです。しかし、反面今回のような影響もでてしまいます。
「.NET Core を使っていると決定論的ビルドが既定で有効化される」との情報も見つかりますが、.NET Framework でプロジェクトを生成してもこの現象は発生します。内部で.NET Coreを使用しているのかな...
#対処法
(以下は、C# Windowsフォームアプリケーション(.NET Framework)のプロジェクトを作成して試しています)
ファイル "<プロジェクト名>.csproj" を直接開き、<PropertyGroup>要素内にある<Deterministic>要素の値がtrueになっているので、これをfalseに書き換えて保存します。
csprojファイル更新後、プロジェクトエクスプローラーで「(利用不可)」と表示されているので、プロジェクト項目を右クリックして「プロジェクトの再読み込み」を選択すると、通常どおりに読み込まれて開発作業ができるようになります。
ちなみに、csc や msbuild のコンパイルオプションでも、決定論的ビルドを使用するか否かを指定できるようです(Visual Studio でビルドする際、csproj ファイルで結局はコンパイルオプションを指定しているのでしょう)
#おわりに
Visual Studio の進化が最近著しくて嬉しい一方、アップデートしてから不明なコンパイルエラーになったりすることもあります。当たり前ですが、納期が近い時にツール類のアップデートは控えることが賢明ですね。
#参考情報
- Auto Versioning in Visual Studio 2017 (.NET Core) --- Stack Overflow
- Determinism end-user experience is poor -- GitHub
- ピックアップ Roslyn 2/10 --- ++C++; // 未確認飛行 C さん
- -deterministic (C# Compiler Options) --- Microsoft Docs