[解決済み] Visual Studioでアセンブリ参照の「特定のバージョン」プロパティは、具体的にどのように機能するのですか?
質問
今日、Visual Studio 2010 のアセンブリ参照の "Specific Version" プロパティを詳しく見てみました。いくつかの実験で予想外の結果が出たので、このプロパティがどのように機能するのか、できるだけ多くのことを学ぼうと思いました。SOでさえ、すべての答えを持っていないようなので、ここではその疑問に対する自己解決を試みます。
どのように まさに Visual Studio では、アセンブリ参照の "Specific Version" プロパティはどのように機能するのでしょうか?
どのように解決するのですか?
コンパイル時のプロパティです
最も重要なことの1つは、"Specific Version"は、次の時点で有効になるプロパティであるということです。 コンパイル時 と ない を実行時に指定します。
どんな内容なのでしょうか?
プロジェクトをビルドするとき、ビルドシステムが使用すべき物理的なアセンブリを見つけるために、プロジェクトのアセンブリ参照を解決する必要があります。Specific Version" チェックが実行されると (「"Specific Version" チェックが実行されるタイミング」を参照)、アセンブリ解決プロセスの結果に影響します。
- ビルドシステムが使用可能な物理アセンブリを探す
- ビルドシステムは、物理アセンブリのバージョンをアセンブリ参照の.csprojファイルに格納されているアセンブリのバージョンと比較します。
- 2つのアセンブリのバージョンが完全に同じであれば、解決処理は成功し、見つかった物理アセンブリがビルドに使用されます。
- 2 つのアセンブリのバージョンが一致しない場合、物理アセンブリは破棄され、次のアセンブリの候補を探すことで解決プロセスが続行されます。
- 物理アセンブリの候補が見つからなくなった場合、解決処理は失敗します。この結果、コンパイラ警告(警告 MSB3245)が表示され、参照が解決できなかったことが知らされます。
- 興味深いことに ビルドは続行されます。 コードにアセンブリへの実際の参照がない場合、ビルドは成功します (前述の警告が表示されます)。コードに参照がある場合は、コードが未知の型または名前空間を使用しているかのようなエラーでビルドが失敗します。ビルドが失敗する唯一の理由は 本当に は、警告 MSB3245 です。
アセンブリが解決される順序
アセンブリ解決プロセスがアセンブリ候補を見つける順序は、このようになるようです。
-
で参照されるアセンブリは
<HintPath>
.csproj ファイル内の - プロジェクトの出力先
- 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" チェックによりアセンブリ解決処理が失敗した場合、アセンブリはコピーされません。
参考資料
- VS2005で参照されるアセンブリについて知っておくべきこと (blogs.msdn.com 記事)
- .NET 2.0のアセンブリとバージョン管理に関する新機能 (上記の MSDN の記事を文言まで再現した codemag.com の記事ですが、いくつかのスクリーンショットとアセンブリのバージョニングに関する追加情報が含まれています)
関連
-
[解決済み】XAMLにSystem.Stringを埋め込む
-
[解決済み] BasicHttpsBindingとWsHttpBinding with Transport securityの違いは何ですか?
-
[解決済み] Visual Studioで、既存のディレクトリツリーをプロジェクトに追加するにはどうすればよいですか?
-
[解決済み] Visual Studio の .suo と .user ファイルをソースコントロールに追加する必要がありますか?
-
[解決済み] Visual Studioソリューションのコード行数はどのように数えるのですか?
-
[解決済み] アセンブリファイルのバージョンを取得する方法
-
[解決済み] Visual Studio CodeとVisual Studioの違いは何ですか?
-
[解決済み] Visual Studioのコンパイルエラー "mismatch between processor architecture "を修正するにはどうしたらいいですか?
-
[解決済み] Visual Studio使用時にファイルのビルドバージョンを自動的にインクリメントすることはできますか?
-
[解決済み】Visual Studioでコードを自動フォーマットする方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】この動詞型ではcontent-bodyを送信できない
-
[解決済み] 配置されたアセンブリのマニフェスト定義がアセンブリ参照と一致しない
-
[解決済み] リファレンスの追加にSystem.Web.Mvcが表示されないのはなぜですか?
-
[解決済み] .Netの配列のLongLengthの目的は何ですか?
-
[解決済み] Windowsイベントログで参照される「フレームワークのバージョン」とは何ですか?
-
[解決済み] LINQ: フィルタリング基準で SingleOrDefault と FirstOrDefault() を使用する場合
-
[解決済み] "SSL/TLSセキュアチャネルの信頼関係を当局と確立できませんでした "の解決方法
-
[解決済み] .net の OOM 問題を解決する必要があります。
-
[解決済み] 埋め込みリソーステキストファイルの読み方
-
[解決済み] WCF - メッセージサイズのクォータを増加させる方法