アセンブリの競合が検出された場合、強制的にビルドを失敗させようとしています。
既定の MSBuild スクリプトは、ResolveAssemblyReference というタスクを実行して、すべての依存関係を特定し、競合を解決しようとします。ただし、プライマリ参照と上位バージョンのアセンブリが優先され、ResolveAssemblyReference タスク内のさまざまなルールに応じて、上位バージョンのアセンブリが選択されるか、競合の勝者が任意に選択されます。
このアプローチには問題があります。特定の状況では、ビルドは問題なく成功しますが、実行時に失敗します。例えば
App->Assembly1->Assembly3 V1
App->Assembly2->Assembly3 V1.1
ResolveAssemblyReference 内の厳密な名前とルールによっては、Assembly3V1 が競合の勝者として選択されることがあるため、Assembly2 が Assembly3 のバージョン 1.1 の新しいメソッドまたはクラスに依存している場合、ランタイム エラーが生成される可能性があります。(ビルドの成功とランタイムの失敗を引き起こす可能性のある多くのバリエーションがあります)
プロジェクト参照から離れて、内部コンポーネント管理に NuGet を使用し始めているため、この問題は私たちにとってより大きな問題になります。競合が検出されたときにビルドが失敗するようにデフォルトの MSBuild スクリプトを変更したいと思います (検証済みの競合をオーバーライド/無視する機能を使用)。
問題は、ResolveAssemblyReference タスクが完全に競合を特定する一方で、競合を解消した参照がプライマリ参照であるという特定のケースでのみ警告を生成することです。他のすべての競合については、ビルド出力にメッセージを記録するだけです。
競合が検出された場合に警告またはエラーを生成してビルドが失敗するようにする方法を探しています。
アイデア?