使用Visual Studio强制引用是绝对的

Jer*_*emy 18 visual-studio-2008 visual-studio

在VS(本例中为2008)中添加对Web应用程序项目的引用时,将创建csproj文件中的"hintpath"作为相对引用.有没有办法(使用GUI,而不是手动编辑文件)使其成为绝对引用(即C:\ Temp\DllName.dll)?

我遇到的问题是当单独的构建机器具有项目的不同工作目录时.当引用是相对的,并且引用的dll不在项目工作目录中时,相对引用可能不指向两台机器上的相同位置.

her*_*ube 10

这是一个老问题,但它仍然是相关的.我在寻找解决方案时偶然发现了它如何从第三方软件的全局存储库中引用程序集.

我现在的方法类似于thinkOfaNumber写的答案.我更喜欢将环境变量嵌入到.csproj文件中,而不是使用硬编码的绝对路径.然后环境变量保存绝对路径.例:

<Reference Include="Foo">
  <HintPath>$(THIRDPARTY_ROOT)\foo\3.1.0\bin\foo.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)

这种额外的间接级别可以灵活地在不同的构建机器上拥有不同的路径(例如开发人员系统与构建服务器).

不过,我仍然需要手动编辑.csproj文件来执行此操作.

  • 请记住,VS缓存`.suo`文件中引用的程序集的路径.因此,如果更改THIRDPARTY_ROOT env变量的值,请不要忘记关闭解决方案并删除`.suo`文件,然后重新打开解决方案. (4认同)

thi*_*ber 6

我发现这样做的唯一方法是在添加引用后手动编辑csproj文件.

<Reference Include="foo, Version=1.2.3.4, Culture=neutral, ...">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>C:\absolute\path\foo.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)

是的,我讨厌绝对路径和它创建的所有自动部署疯狂,但在这种情况下,我必须引用一个.NET包装器,它使用必须"安装"的COM dll并对注册表执行操作等等.绝对路径是唯一的出路.


Rog*_*mbe 5

默认情况下,Visual Studio在最初添加引用时使用相对引用,因为它假定引用是指工作副本中其他位置的文件.

这曾经让我疯了,但我用三种不同的方式解决了它:

  1. 通过将我的源代码保存在我的D:驱动器上,意味着C:驱动器上引用的DLL无法与相对路径一起存储.
  2. 通过说服权力,可以为所有开发人员工作站使用单个图像/脚本.既然它们都是一样的,那么这些文件都在C:驱动器上的相同位置.
  3. 通过意识到您可以向AssemblyFolders注册表项添加文件夹,这意味着您不再需要使用任何类型的路径来引用已知程序集.

  • 是的,把它放在另一个驱动器上,或者映射为另一个驱动器的东西似乎是解决这个问题的唯一方法。 (2认同)

Gar*_*ary -2

我想提供帮助,但为什么这是必要的?自 2003 年 vs.net beta 以来,我从来没有这样做过。我认为这里还有另一个更深层次的问题。

如果必须,您可以尝试项目属性中的“参考路径”页面

  • 我领导 .net 团队多年,这样你就会发疯的。这是我解决的第一件事。让每个人都咬紧牙关,组织您的解决方案项目并引用并切断任何参与该项目的人的{beep}。 (2认同)
  • 这不是一个真正的答案,是吗?如果您愿意讨论这个问题,发表评论会更合适。 (2认同)