14

我们永远都会遇到这个问题,我们有许多解决方案和一个相邻的 /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>

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

4

3 回答 3

6

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

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

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

可能的解决方案:

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

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

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

请 Microsoft - 在 Reference 属性页面中添加一个选项,该选项将优先考虑提示路径(我们明确指定)而不是意外的魔法路径......或者至少,如果两者彼此不同,则抛出警告/错误!

于 2014-03-26T13:05:56.067 回答
1

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

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

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

于 2013-07-31T11:25:21.360 回答
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

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

于 2015-11-25T16:40:54.910 回答