【问题标题】:Referenced assemblies automatically replaced by visual studioVisual Studio 自动替换引用的程序集
【发布时间】:2013-07-08 12:16:48
【问题描述】:

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

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

【问题讨论】:

  • 单元测试 PCL 代码有 been a problem。解决方法是为您想要支持的特定平台创建测试。

标签: .net visual-studio portable-class-library


【解决方案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 包,包括所有项目中的所有依赖项 - 您可以通过右键单击解决方案资源管理器 -> 托管 NuGet 包解决方案来完成此操作

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

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

4) 重新安装软件包

这应该让你处于良好状态。

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

【讨论】:

  • 我只是这样做了,但最终遇到了同样的问题。我创建了一个 .net 4.5 测试项目并引用了那些确切的 v1.5 dll,Visual Studio 最终仍然指向 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades\System.Runtime.dll 等。
  • 你是如何引用二进制文件的? 不要直接引用这些二进制文件 - 让 NuGet 安装包。如果问题仍然存在,您可以使用此页面上的联系所有者链接:nuget.org/packages/Microsoft.Bcl/1.0.19。我们将组织一次重现。
【解决方案2】:

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

我不确定是否是插件造成的。

【讨论】:

    【解决方案3】:

    有类似的问题(并且可能会节省一些人的沮丧工作) - 结果证明 解决方案中的引用路径(右键单击 PROJECT(不是解决方案),然后选择属性。在左侧有项目的设置(Application、Compile、Debug、Referenes 等)。

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

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

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

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

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

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

      希望这对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多