【问题标题】:Visual Studio 2010 - how to force project reference to use exact path NOT GAC or Program Files?Visual Studio 2010 - 如何强制项目引用使用确切路径而不是 GAC 或程序文件?
【发布时间】:2013-07-31 19:41:18
【问题描述】:

我们永远都会遇到这个问题,我们有许多解决方案和一个相邻的 /Components/ 文件夹。我们要引用的所有 DLL 都在这个文件夹中。其中一些是我们从源代码构建的,以使用仅存在于组件二进制文件中的特定版本号,但是当不同机器上的用户从 TFS 获取最新的所有内容时,Visual Studio 仍然会更改磁盘结构对安装在 Program Files、GAC 或其他地方的引用。

已尝试手动编辑 proj 文件以包含 HintPath,例如

<Reference Include="Foo, Version=5.5.5.5, Culture=neutral, processorArchitecture=MSIL">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\Components\Foo.dll</HintPath>
</Reference>

无济于事。我们如何强制视觉工作室尊重这条道路?

【问题讨论】:

  • 您确定没有在 .user/targets 文件中指定 ReferencePath 吗?它优先于 HintPath。在stackoverflow.com/a/2733113/105350 上查看更多信息。另外,你说的“无用”是什么意思? VS 从文件中删除HintPath 还是什么?

标签: .net visual-studio-2010


【解决方案1】:

提示路径有时会有点困难。 Visual Studio 有时并不像我们需要的那样智能,这就是我们可以在 XML 中编辑 csproj 文件的原因。这样做的方法是执行以下操作:

1.) 在解决方案资源管理器中右键单击项目并选择“卸载项目”。 // 这将使项目在解决方案资源管理器中处于非活动状态。

2.) 在项目处于非活动状态时再次右键单击该项目,然后选择“Edit YourProject.ext”,其中 ext 是 vbproj 或 csproj。 这将在 Visual Studio 中打开一个 XML 编辑器。 //如果需要在文件内搜索,可以按Ctrl-F,但是要记住,必须将“查找范围:”调整为“当前文档”,否则搜索不到。

3.) 查看/编辑完成并保存更改后,关闭 XML 文件,再次右键单击项目并选择“重新加载项目”。

我解释了我从这里找到的这些步骤:http://wiki.visualwebgui.com/pages/index.php/Visual_Studio_HintPath#Viewing_or_editing_the_project_file

我希望这会有所帮助,它对我有所帮助。

【讨论】:

    【解决方案2】:

    除了指定“hintPath”之外,将“SpecificVersion”设置为 true 似乎是一种解决方案,因为它“防止 Visual Studio 使用多个目标规则进行程序集解析”。

    但是,一旦 foo.dll 不可用(在构建或加载项目时)Visual Studio 魔法就会启动并将程序集目标路径更改为最近的“匹配”程序集。

    在此之后,原始 foo.dll 是否恢复到其位置(在目标路径名处)甚至 CHANGED 都无关紧要! - Visual Studio 仍然引用其新找到的匹配项。 这是非常不可取的

    可能的解决方案:

    1. 强名称 foo.dll,但 foo.dll 可能只引用其他强名称程序集(通常不受欢迎)。

    2. 通过在父应用程序中注册事件来自定义程序集解析。这使您可以准确定义在运行时在何处找到目标程序集 - 但解决这个简单问题似乎需要付出太多努力。

    我的解决此问题的方法很容易)是将 LOCAL COPY 设置为 FALSE,并向项目添加构建后步骤,手动复制目标程序集到目标 bin 文件夹。不好的部分是在构建后步骤和项目的引用配置之间创建的重复(和解耦)量。

    请微软 - 在 Reference 属性页中添加一个选项,该选项将把 hintPath(我们明确指定)优先于意外的魔法路径......或者至少,抛出一个警告/error 如果两者不同!

    【讨论】:

    • 在 VS2015 中看到相同的行为。对于像 MSBuild 这样的成熟构建系统来说,这是非常糟糕的行为。
    【解决方案3】:

    我们有相同的设置 - 我们在单独的文件夹中引用第 3 方程序集(以及我们自己的一些程序集),.csproj 文件中的提示对我们来说工作得很好。

    Visual Studio 将首先尝试在 HintPath 中查找 dll,只有在找不到时,它才会进一步查找 - 正在执行的程序集、解决方案文件夹或 GAC 旁边的二进制文件。另外,请记住项目属性中的Reference Paths 选项卡与HintPath 的处理方式相同,并且列出的文件夹提示顺序很重要。

    如果这仍然困扰着您,也许您应该考虑建立自己的本地 NuGet 服务器(据说这并不复杂),在加载解决方案时会自动从中收集程序集。这有点矫枉过正,但它也解决了在不同解决方案中使用多个版本的 dll 的问题。我们还没有这样做,所以我不能直接推荐它,但它在我们的待办事项清单上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多