Visual StudioのHintPathとReferencePath


120

違いを正確に何であるHintPath.csprojファイルとReferencePath.csproj.userファイルが?私たちは、依存関係DLLが「リリース」のsvnリポジトリにあり、すべてのプロジェクトが特定のリリースを指しているという慣習にコミットしようとしています。異なる開発者は異なるフォルダー構造を持っているため、相対参照は機能しないため、特定の開発者のリリースフォルダーを指す環境変数を使用して絶対参照を作成するスキームを考え出しました。したがって、参照を追加した後、プロジェクトファイルを手動で編集して、環境変数を使用して参照を絶対パスに変更します。

私は、これは、両方で行うことができることに気付きましたHintPathReferencePath、私はそれらの間見つけることができる唯一の違いは、それがあるHintPathビルド時に解決され、ReferencePathプロジェクトがIDEにロードされたとき。それがどのような影響をもたらすのかはよくわかりません。VSがを書き換えることが.csproj.userあり、を書き換える必要があることに気付きましたがReferencePath、何が原因なのかわかりません。

.csproj.userファイルはユーザー固有のものであるため、チェックインしない方がよいと聞いたので、それを目指したいのですが、HintPath-specified DLLがロードされることが「保証」されていない場合にも、同じDLLは、たとえばプロジェクトの出力ディレクトリにあります。これについて何か考えはありますか?

回答:


133

このMSDNブログによると:https : //blogs.msdn.microsoft.com/manishagarwal/2005/09/28/resolving-file-references-in-team-build-part-2/

ビルド時にアセンブリの検索順序があります。検索順序は次のとおりです。

  • 現在のプロジェクトのファイル– $ {CandidateAssemblyFiles}で示されます。
  • .user / targetsファイルからの$(ReferencePath)プロパティ。
  • %(HintPath)メタデータは参照アイテムによって示されます。
  • ターゲットフレームワークディレクトリ。
  • AssemblyFoldersEx Registrationを使用するレジストリにあるディレクトリ。
  • $ {AssemblyFolders}で示される登録済みのアセンブリフォルダー。
  • $(OutputPath)または$(OutDir)
  • GAC

したがって、目的のアセンブリがHintPathによって検出されたが、ReferencePathを使用して代替アセンブリを検出できる場合は、HintPathのアセンブリよりもReferencePathのアセンブリが優先されます。


2
彼らがVS2019でこれを変更したことを除いて-私たちはこのセットアップを何年も使用しています。もう違います。リポジトリのファイルは現在ソリューションのビルドのDLLファイルよりも高い優先度を持っている-ゴーフィギュア:(
クリスチャン・

@Christian:リポジトリファイルとは何ですか?これについてもっと情報がありますか?
テスト

@testing外部参照パスについて話しています。VSのプロジェクト設定で設定できます。残念ながら、プロジェクト環境(3つの異なる環境があります)のこの非常に重要な設定は、プロジェクト設定に保存できません。そのため、コマンドラインコンパイルスクリプトにパラメーターとして明示的に追加する必要があります。
クリスチャン

31

Microsoft.Common.targetsファイルを確認します

質問に対する答えは、Microsoft.Common.targetsターゲットフレームワークバージョンのファイルにあります。

.Net Frameworkバージョン4.0(および4.5!)の場合、AssemblySearchPaths要素は次のように定義されます。

    <!--
    The SearchPaths property is set to find assemblies in the following order:

        (1) Files from current project - indicated by {CandidateAssemblyFiles}
        (2) $(ReferencePath) - the reference path property, which comes from the .USER file.
        (3) The hintpath from the referenced item itself, indicated by {HintPathFromItem}.
        (4) The directory of MSBuild's "target" runtime from GetFrameworkPath.
            The "target" runtime folder is the folder of the runtime that MSBuild is a part of.
        (5) Registered assembly folders, indicated by {Registry:*,*,*}
        (6) Legacy registered assembly folders, indicated by {AssemblyFolders}
        (7) Resolve to the GAC.
        (8) Treat the reference's Include as if it were a real file name.
        (9) Look in the application's output folder (like bin\debug)
    -->
<AssemblySearchPaths Condition=" '$(AssemblySearchPaths)' == ''">
  {CandidateAssemblyFiles};
  $(ReferencePath);
  {HintPathFromItem};
  {TargetFrameworkDirectory};
  {Registry:$(FrameworkRegistryBase),$(TargetFrameworkVersion),$(AssemblyFoldersSuffix)$(AssemblyFoldersExConditions)};
  {AssemblyFolders};
  {GAC};
  {RawFileName};
  $(OutDir)
</AssemblySearchPaths>

.Net Framework 3.5の場合、定義は同じですが、コメントが間違っています。2.0の定義は少し異なり、$(OutDir)の代わりに$(OutputPath)を使用します。

私のマシンには、Microsoft.Common.targetsファイルの次のバージョンがあります。

C:\Windows\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets
C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets

C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Microsoft.Common.targets
C:\Windows\Microsoft.NET\Framework64\v3.5\Microsoft.Common.targets
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets

これは、Windows 7にインストールされたVisual Studio 2008、2010、および2013を使用した場合です。

(元の投稿者が指摘しているように)出力ディレクトリが検索されるという事実は、不適切なHintPathを隠す可能性があるため、少しイライラすることがあります。ソリューションはローカルマシンで正常にビルドされますが、クリーンなフォルダー構造(ビルドマシンなど)でビルドすると壊れます。


同様の問題があり、この場合、dllファイルをどこに配置すればよいですか?FrameworkまたはFramework64?stackoverflow.com/questions/45945579/...
チェタンSachdev

5

私自身の経験では、次の2種類のアセンブリ参照のいずれかに固執するのが最善です。

  • 現在のビルドディレクトリの「ローカル」アセンブリ
  • GACのアセンブリ

私は(あなたが説明したように)他の方法が簡単に壊れたり、煩わ​​しいメンテナンス要件があることを発見しました。

GACに含めたくないアセンブリは、実行ディレクトリに存在する必要があります。実行ディレクトリI GAC(自動ビルドイベントによって管理される)に存在しない、または存在できないアセンブリ。

これまでのところ問題はありません。動作しない状況があると確信していますが、問題に対する通常の答えは「ああ、ただGACです!」でした。8 D

お役に立てば幸いです。


1

これは古いドキュメントですが、「HintPath」が別のマシンで無視される問題を解決するのに役立ちました。これは、参照されるDLLもソース管理に含まれている必要があるためです。

https://msdn.microsoft.com/en-us/library/ee817675.aspx#tdlg_ch4_includeoutersystemassemblieswithprojects

抜粋:

外部システムアセンブリを含めて参照するには
1.ソリューションエクスプローラーで、アセンブリを参照する必要があるプロジェクトを右クリックし、[既存のアイテムの追加]をクリックします。
2.アセンブリを参照し、[OK]をクリックします。次に、アセンブリがプロジェクトフォルダーにコピーされ、自動的にVSSに追加されます(プロジェクトが既にソース管理下にあると想定)。
3. [参照の追加]ダイアログボックスの[参照]ボタンを使用して、プロジェクトフォルダー内のアセンブリへのファイル参照を設定します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.