我们永远遇到这个问题,我们有许多解决方案和相邻的/ 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>
无济于事。我们如何迫使视觉工作室尊重这条道路?
答案 0 :(得分:6)
设置&#34; SpecificVersion&#34;为true,除了指定&#34; hintPath&#34;似乎是一种解决方案,因为它阻止了视觉工作室使用多个目标规则进行装配解决方案。
但是,一旦foo.dll不可用(在构建或加载项目时),Visual Studio魔术就会启动并将程序集目标路径更改为最近的匹配&#39;组装
在此之后,原始foo.dll是否已恢复到其位置(目标路径名)或已更改并不重要! - Visual studio仍然指其新发现的匹配。 这是非常不受欢迎的。
可能的解决方案:
强名称foo.dll,但是foo.dll可能只引用其他强名称程序集(通常是不受欢迎的)。
通过在父应用程序中注册事件来自定义程序集解析。这允许您在运行时准确定义目标程序集的位置 - 但这似乎是解决此简单问题的过多努力。
我解决此问题(轻松)是将LOCAL COPY设置为FALSE,并为项目添加一个后期构建步骤,该步骤手动复制目标程序集到目标bin文件夹。关于这一点的不好的部分是在构建后步骤和项目的References配置之间创建的重复(和解耦)的数量。
请微软 - 在Reference属性页面添加一个选项,该选项将优先考虑hintPath(我们明确指定)在惊人的魔术路径上...或者至少会抛出警告/如果两者彼此不同,则出错!
答案 1 :(得分:1)
我们有相同的设置 - 我们在一个单独的文件夹中引用第三方程序集(以及我们自己的一些程序集),.csproj
文件中的提示对我们来说效果很好。
Visual Studio将首先尝试在HintPath
中找到dll,并且只有在找不到它时,才会进一步查看 - 执行程序集,解决方案文件夹或GAC旁边的二进制文件。另外,请记住,项目属性中的Reference Paths
选项卡的处理方式与HintPath
相同,并且列出的文件夹提示顺序很重要。
如果这仍然困扰着你,也许你应该考虑提高你自己的本地NuGet服务器(据说这并不是那么复杂),在解决方案加载时会自动收集程序集。这有点过分,但它也处理了在不同解决方案中使用多个版本的dll的问题。我们还没有这样做,所以我不能直接推荐它,但它在我们的待办事项清单上。
答案 2 :(得分:1)
提示路径有时可能有点困难。 Visual Studio不像我们有时需要它那样聪明,这就是为什么我们可以用XML编辑csproj文件的原因。这样做的方法是执行以下操作:
1。)右键单击解决方案资源管理器中的项目,然后选择&#34;卸载项目&#34;。 //这将使项目在解决方案资源管理器中处于非活动状态。
2。)右键单击项目,当它处于非活动状态时,选择&#34;编辑你的项目。文本&#34;其中ext是vbproj或csproj。 这将在Visual Studio中打开XML编辑器。 //如果您需要在文件中搜索,可以按Ctrl-F,但请记住您必须调整&#34;查看:&#34;是&#34;当前文件&#34;,否则将不会被搜索。
3。)查看/编辑完成并保存更改后,关闭XML文件,再次右键单击项目并选择&#34;重新加载项目&#34;。
我解释了我从这里找到的这些步骤:http://wiki.visualwebgui.com/pages/index.php/Visual_Studio_HintPath#Viewing_or_editing_the_project_file
我希望这有帮助,它帮助了我。