1. ホーム
  2. .net

[解決済み] Visual Studioでアセンブリ参照の「特定のバージョン」プロパティは、具体的にどのように機能するのですか?

2022-04-24 17:39:50

質問

今日、Visual Studio 2010 のアセンブリ参照の "Specific Version" プロパティを詳しく見てみました。いくつかの実験で予想外の結果が出たので、このプロパティがどのように機能するのか、できるだけ多くのことを学ぼうと思いました。SOでさえ、すべての答えを持っていないようなので、ここではその疑問に対する自己解決を試みます。

どのように まさに Visual Studio では、アセンブリ参照の "Specific Version" プロパティはどのように機能するのでしょうか?

どのように解決するのですか?

コンパイル時のプロパティです

最も重要なことの1つは、"Specific Version"は、次の時点で有効になるプロパティであるということです。 コンパイル時 ない を実行時に指定します。

どんな内容なのでしょうか?

プロジェクトをビルドするとき、ビルドシステムが使用すべき物理的なアセンブリを見つけるために、プロジェクトのアセンブリ参照を解決する必要があります。Specific Version" チェックが実行されると (「"Specific Version" チェックが実行されるタイミング」を参照)、アセンブリ解決プロセスの結果に影響します。

  • ビルドシステムが使用可能な物理アセンブリを探す
  • ビルドシステムは、物理アセンブリのバージョンをアセンブリ参照の.csprojファイルに格納されているアセンブリのバージョンと比較します。
  • 2つのアセンブリのバージョンが完全に同じであれば、解決処理は成功し、見つかった物理アセンブリがビルドに使用されます。
  • 2 つのアセンブリのバージョンが一致しない場合、物理アセンブリは破棄され、次のアセンブリの候補を探すことで解決プロセスが続行されます。
  • 物理アセンブリの候補が見つからなくなった場合、解決処理は失敗します。この結果、コンパイラ警告(警告 MSB3245)が表示され、参照が解決できなかったことが知らされます。
  • 興味深いことに ビルドは続行されます。 コードにアセンブリへの実際の参照がない場合、ビルドは成功します (前述の警告が表示されます)。コードに参照がある場合は、コードが未知の型または名前空間を使用しているかのようなエラーでビルドが失敗します。ビルドが失敗する唯一の理由は 本当に は、警告 MSB3245 です。

アセンブリが解決される順序

アセンブリ解決プロセスがアセンブリ候補を見つける順序は、このようになるようです。

  1. で参照されるアセンブリは <HintPath> .csproj ファイル内の
  2. プロジェクトの出力先
  3. GAC

GACに複数のバージョンのアセンブリが存在する場合、解決プロセスは最初に最も高いバージョンのアセンブリに解決しようとすることに注意してください。これは、"Specific Version"のチェックが行われていない場合にのみ重要です。

特定バージョンの確認はどのような場合に行うのですか?

Visual Studio では、.csproj ファイルにある 2 つの情報に基づいて、"Specific Version" チェックを行うかどうかを決定します。

  • の有無。 <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">
[...]

次の表は、"Specific Version"チェックが実行される場合とされない場合を示しています。

                   |     Version information
                   |  Present       Not present
-------------------+------------------------------
<SpecificVersion>  |
- Present(=True)   |  1.Yes         2.Yes (check always fails)
- Present(=False)  |  3.No          4.No
- Not present      |  5.Yes         6.No

ここで驚くべきことは、もし両方の <SpecificVersion> とバージョン情報がない場合(ケース6)。私の理解では、バージョン情報がない場合(ケース6)、チェックが行われ、必ず失敗するものと思っていました。 <SpecificVersion> は、デフォルト値 "True" を意味します。これは、私がテストを行ったVisual Studio 2010の癖かもしれません。

Visual Studio UI でアセンブリ参照のプロパティを調べる(参照を選択して F4 キーを押す)と、"Specific Version" プロパティの値によって Visual Studio が "Specific Version" チェックを実行するかどうかがわかります。6の場合、UIは"True"を表示しますが、その前に <SpecificVersion> 要素が.csproj ファイルに存在しません。

ローカルをコピーする」の副作用について。

プロパティが "True" に設定されていても、"Specific Version" チェックによりアセンブリ解決処理が失敗した場合、アセンブリはコピーされません。

参考資料