VisualStudio 中的 HintPath 与 ReferencePath

中的 HintPath之间的确切区别是什么。Csproj 文件和 .csproj.user文件中的 ReferencePath?我们试图遵循一个约定,其中依赖 DLL 位于“发布”svn repo 中,所有项目都指向一个特定的发布。因为不同的开发者有不同的文件夹结构,相对引用不起作用,所以我们想出了一个方案,使用一个指向特定开发者的发布文件夹的环境变量来创建一个绝对引用。因此,在添加引用之后,我们手动编辑项目文件,使用环境变量将引用更改为绝对路径。

我注意到 HintPathReferencePath都可以做到这一点,但是我发现它们之间的唯一区别是 HintPath在构建时解析,而 ReferencePath在项目加载到 IDE 中时解析。但我不确定这样做的后果是什么。我注意到 VS 有时候会重写 .csproj.user,我必须重写 ReferencePath,但是我不确定是什么触发了它。

我听说最好不要检入 .csproj.user文件,因为它是特定于用户的,所以我想以此为目标,但我也听说,如果相同的 DLL 位于项目的输出目录中,那么 HintPath指定的 DLL 就不能“保证”加载。有什么想法吗?

132941 次浏览

根据这个 MSDN 博客: https://blogs.msdn.microsoft.com/manishagarwal/2005/09/28/resolving-file-references-in-team-build-part-2/

生成程序集时有一个搜索顺序。搜索顺序如下:

  • 来自当前项目的文件-由 ${ CandidateAssemblyFiles }指示。
  • $(ReferencePath)属性,该属性来自. user/target 文件。
  • 由引用项指示的% (HintPath)元数据。
  • 目标框架目录。
  • 在使用 AssemblyFoldersEx 注册的注册表中找到的目录。
  • 已注册的程序集文件夹,由 ${ AssemblyFolders }指示。
  • $(OutputPath)或 $(OutDir)
  • GAC

因此,如果所需的程序集是由 HintPath找到的,但是可以使用 参考路径找到替代程序集,那么它将优先选择 参考路径’d 程序集而不是 HintPath’d 程序集。

我自己的经验是,最好坚持使用两种类型的汇编引用之一:

  • 当前生成目录中的“本地”程序集
  • GAC 的集会

我发现(很像您所描述的)其他方法要么太容易被破坏,要么有恼人的维护要求。

任何程序集我不想 GAC,必须生活在执行目录。任何不在或不能在执行目录 I GAC (由自动生成事件管理)中的程序集。

到目前为止,这还没有给我带来任何问题。虽然我肯定有一个情况下,它不会工作,通常的答案是任何问题都是“哦,只是广东汽车公司它!”.8D

希望能帮上忙!

查看文件 Microsoft. Common. target

这个问题的答案在目标框架版本的 Microsoft.Common.targets文件中。

对于.Net Framework 版本4.0(和4.5!) ,AssemblySearchPath 元素的定义如下:

    <!--
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的定义是相同的,但是注释是错误的。0的定义稍有不同,它使用 $(OutputPath)而不是 $(OutDir)。

在我的机器上,我有以下版本的文件 Microsoft. Common.target:

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

这是安装在 Windows7上的 VisualStudio2008、2010和2013。

搜索输出目录的事实可能有点令人沮丧(正如原始海报所指出的) ,因为它可能隐藏了一个不正确的 HintPath。解决方案在您的本地计算机上构建 OK,但是在一个干净的文件夹结构(例如在构建计算机上)上构建时会中断。

虽然这是一个旧文档,但它帮助我解决了在另一台机器上忽略“ HintPath”的问题。这是因为引用的 DLL 也需要在源代码管理中:

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

节选:

To include and then reference an outer-system assembly
1. In Solution Explorer, right-click the project that needs to reference the assembly,,and then click Add Existing Item.
2. Browse to the assembly, and then click OK. The assembly is then copied into the project folder and automatically added to VSS (assuming the project is already under source control).
3. Use the Browse button in the Add Reference dialog box to set a file reference to assembly in the project folder.