4

我有 2 个项目,一个可移植类库和一个常规单元测试项目。在 Portable 类库中,我使用 NuGet 来引用 Microsoft.BCL Portability 包,它带有 2 个程序集(System.Threading.Tasks.dll并且System.Runtime.dll都是 v1.5)。

但是,当我尝试在我的单元测试项目中引用这些相同的 dll(使用 NuGet 并手动浏览到目录\packages\Microsoft.Bcl.1.0.19\lib\portable-net40+sl4+win8+wp71)时,Visual Studio 会自动将引用指向位于此处的另一个文件夹中的 dll,该文件夹C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\的版本为 4.5。

现在我需要测试的方法接受CancellationToken作为参数并引发编译错误:The type 'System.Threading.CancellationToken' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Threading.Tasks, Version=1.5.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'因为它的 v4.5 库是引用的内容而不是 v1.5。

然而,我已经能够为不使用 v1.5 BCL 库中的任何这些功能的方法编写测试。

为什么 Visual Studio 将我引用的库替换为框架附带的库?我如何告诉视觉工作室只使用我在特定目录中指向的那些?

使用 Visual Studio 2012 更新 2。

4

4 回答 4

1

预计 System.Runtime.dll v1.5/v2.5 和 System.Threading.Tasks.dll v1.5/v2.5 的引用将替换为 .NET Framework 4.5 项目平台中的引用。但是,这应该发生在幕后,不应该被观察到。

我怀疑发生的事情是您从 .NET Framework 4.0 测试项目开始并重新定位到 .NET Framework 4.5。不幸的是,发生这种情况时,NuGet 不会重新安装包以使 4.5 项目处于正确状态。要尝试解决此问题,请尝试以下操作:

1) 卸载 Microsoft.Bcl.Async 包,包括所有项目中的所有依赖项 - 您可以通过右键单击解决方案资源管理器 -> Managed NuGet Packages for Solution 来执行此操作

2) 在每个安装了包的项目中打开任何 App.Config,并删除所有引用 System.Runtime 和 System.Threading.Tasks 的 assemblyBinding 条目。

3) 确保没有项目引用 System.Runtime 和 System.Threading.Tasks,如果是,请删除引用

4)重新安装软件包

这应该使您处于良好状态。

请注意,此行为在 NuGet 2.7 中得到了改进,当您进入此状态时,它们现在会在重定向时发出错误/警告。

于 2013-07-10T16:51:08.730 回答
1

这似乎是 Visual Studio 更新 2 的问题,因为 Visual Studio 2013 不会发生这种情况。我在较新版本的 Visual Studio 中打开了该项目并加载了正确的程序集。

我不确定插件是否是导致此问题的原因。

于 2013-09-15T12:53:12.827 回答
0

有类似的问题(并且可能会为某人节省一天的工作) - 结果是解决方案中的参考路径(右键单击项目(不是解决方案),然后选择属性。在左侧有项目的设置(应用程序,编译、调试、引用等)。

选择“引用”,然后选择“引用”网格上方的“引用路径”按钮。如果此处的任何引用指向可以找到旧 DLL 的目录,VS(在我的情况下为 2013 年)将从此处选择一个 DLL。

在“参考”网格中可以看到实际用于解析 DLL 的路径。

删除所有过时的路径,然后重新编译。

这也删除了 NuGet“无法为 'XXYYZZ' 生成绑定重定向。已添加具有相同键的项目。”

于 2014-04-02T12:04:43.637 回答
0

以为我会添加这个以防它对任何人有帮助。

我在 Dependencies 文件夹中有第三方 DLL(版本 3.0.120),并在项目中引用它,一切正常。

新版本的 DLL 通过 NuGet 发布。它被安装到:

..\packages\Independentsoft.Exchange.3.0.530\Lib\net45\

为了使用新的 DLL,我删除了旧的引用,清理了项目并添加了新的 DLL 作为新的引用。

然后我编译并部署(我使用 SharePoint)该项目,但代码失败并且调试显示它仍在使用旧引用,即使我已删除它。

然后我注意到,在研究 VS 中新引用的属性时,DLL 的版本号始终是旧版本(3.0.120)而不是新版本(3.0.530)。

几个小时后,我删除了 Dependencies 文件夹中的旧 DLL,清理、构建和部署了项目,然后一切正常。

看来,只要项目中存在旧 DLL,VS 就会不断地将对新版本的任何新引用指向旧版本。

希望这可以帮助某人。

于 2019-09-06T16:25:01.323 回答