Visual Studio 2010 - 如何强制项目引用使用精确路径NOT GAC或Program Files?

14 .net visual-studio-2010

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

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

<Reference Include="Foo, Version=5.5.5.5, Culture=neutral, processorArchitecture=MSIL">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\Components\Foo.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)

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

For*_*ann 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文件夹.关于这一点的不好的部分是在构建后步骤和项目的References配置之间创建的重复(和解耦)的数量.

请微软 - 在Reference属性页面添加一个选项,该选项将优先考虑hintPath(我们明确指定)在惊人的魔术路径上...或者至少,如果两者彼此不同,则抛出警告/错误!

  • 在VS2015中看到相同的行为.这对于像MSBuild这样的成熟构建系统来说是非常糟糕的行为. (2认同)

vel*_*koz 1

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

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

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