回答:
知っておくべき最も重要なことの1つは、「特定のバージョン」は、実行時ではなくコンパイル時に有効になるプロパティであることです。
プロジェクトがビルドされるとき、ビルドシステムが使用する必要のある物理アセンブリを見つけるために、プロジェクトのアセンブリ参照を解決する必要があります。「特定のバージョン」チェックが実行された場合(「「特定のバージョン」がチェックされるのはいつですか?」のセクションを参照)、アセンブリ解決プロセスの結果に影響します。
アセンブリ解決プロセスが潜在的なアセンブリを見つける順序は次のように見えます。
<HintPath>
.csprojファイルの要素によって参照されるアセンブリアセンブリの複数のバージョンがGACに存在する場合、解決プロセスは最初に最も高いバージョンのアセンブリへの解決を試みます。これは、「特定のバージョン」チェックが行われていない場合にのみ重要です。
Visual Studioは、.csprojファイルにある2つの情報に基づいて「特定のバージョン」チェックを実行するかどうかを決定します。
<SpecificVersion>
要素の有無とその値(存在する場合)これは、バージョン情報を含む一般的なアセンブリ参照は次のようになります。
<Reference Include="Foo, Version=1.2.3.4, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>True</SpecificVersion>
<HintPath>..\..\Bar\Foo.dll</HintPath>
</Reference>
そして、これはバージョン情報なしでアセンブリ参照がどのように見えるかです:
<Reference Include="Foo">
[...]
次の表は、「特定のバージョン」チェックが実行される場合と実行されない場合を示しています。
| Version information
| Present Not present
----------------------------+------------------------------
<SpecificVersion> |
- Present, has value True | Yes (1) Yes (check always fails) (2)
- Present, has value False | No (3) No (4)
- Not present | Yes (5) No (6)
ここで意外なのは<SpecificVersion>
、バージョン情報とバージョン情報の両方が存在しない場合(ケース6)、チェックが実行されないことです。チェックが実行され、常に失敗することを期待していました(ケース2と同じ)<SpecificVersion>
。これは、テストを行ったVisual Studio 2010の癖かもしれません。
Visual Studio UIでアセンブリ参照のプロパティを調べるとき(参照を選択してF4を押す)、「特定のバージョン」プロパティに表示される値は、Visual Studioが「特定のバージョン」を実行するかどうかを示します小切手。ケース6の場合、UIには「True」と表示されますが、<SpecificVersion>
要素は.csprojファイルには存在しません。
「ローカルのコピー」プロパティが「True」に設定されているが、「特定のバージョン」チェックのためにアセンブリ解決プロセスが失敗した場合、アセンブリはコピーされません。
PublicKeyToken=
パーツが欠落している場合)ためです。また、私の投稿の最後の方で表を確認するVersion=
と、.csprojのアセンブリ名にパーツが欠落している場合でも、バージョンチェックが行われる可能性があることがわかります。質問2:アセンブリ名が比較に使用されていると思います、はい。他の情報源は知りません。
<SpecificVersion>
タグは完全に省略されました。以前はFalseの値でした。
参照を追加すると、Visual Studioはアセンブリの[AssemblyVersion]をプロジェクトファイルに記録します。これは重要。たとえば、1年後にバグ修正を作成する場合、完全に同じバージョンのリファレンスを使用してプロジェクトを再ビルドして、それが真のドロップインであることを確認する必要があります。参照アセンブリが変更されていると、エラーが発生します。
しかし、それが常に望ましいとは限りません。一部のプログラマーは、アセンブリバージョンを自動的にインクリメントさせ、再ビルドするたびに新しいバージョンを生成します。アセンブリのパブリックインターフェイスは変更されていませんが。Nugetを使用してプロジェクトを構成してライブラリを取得し、新しいリリースが利用可能になったときに自動的にライブラリを更新するようにする人もいます。特定のバージョンプロパティをFalseに設定して、コンパイルエラーを抑制します。
結果を理解することは非常に重要です。事故を回避するには、プログラムのビルド全体を再デプロイする必要があります。実行時のバージョンの不一致はプログラムをクラッシュさせ、<bindingRedirect>
危険な.configファイルでのみ抑制できます。
[AssemblyVersion]
アセンブリが厳密な名前で署名されていない場合、CLRは考慮しないと思いました。