26

我在一个项目中使用该Microsoft.Bcl.Async ,并且该项目被另一个不使用异步功能的项目引用。

现在我在编译解决方案(或仅第二个项目)时收到此错误警告:

无法解析主要引用“XYZ.dll”,因为它间接依赖于框架程序集“System.Runtime,Version=1.5.11.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”,在当前目标中无法解析框架。“.NETFramework,版本=v4.0”。要解决此问题,请删除引用“XYZ.dll”或将您的应用程序重新定位到包含“System.Runtime, Version=1.5.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的框架版本。

我在两个项目中都使用了这个 app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:bcl="urn:schemas-microsoft-com:bcl">
      <dependentAssembly bcl:name="System.Runtime">
        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.5.16.0" newVersion="2.5.16.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.5.16.0" newVersion="2.5.16.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

我做错了什么?

我不想引用异步包 dll。

我不能使用 .Net 4.5 目标。它必须是.Net 4。

所有项目的目标框架:.NET Framework 4

4

2 回答 2

23

摘要

有几种解决方法可供您使用:

  1. Microsoft.Bcl.Async包安装到引用项目。

  2. Microsoft.Bcl.Build包安装到引用项目。这包含实际的修复,并且仅仅是构建时的依赖。执行此操作时,您必须在项目的 App.Config 中具有适当的绑定重定向(例如上面列出的内容) - 无论它是类库、Web 项目还是可执行文件。

  3. 如果您不希望依赖于任何包,请获取 Microsoft.Bcl.targets 文件(随 Microsoft.Bcl.Build 一起安装)中的 PropertyGroup 元素的内容,并将其插入到最后一次导入之后的引用项目的底部元素。

注意:无论您在上面选择哪个选项,当您交付依赖于 Microsoft.Bcl.Async 的库时(与旧的 Microsoft.CompilerServices.AsyncTargetingPack 一样),您必须交付这些二进制文件(System.Runtime、System.Threading。 Tasks, Microsoft.Threading.Tasks.*) 与使用您的库的应用程序/包。

长篇大论

正如 Peter 指出的那样,这是一个已知问题,由于它们的设计方式,它只发生在 Microsoft.Bcl.Async 而不是 Microsoft.CompilerServices.AsyncTargetingPack。

Microsoft.Bcl.Async 的部分设计是向后移植(通过 NuGet 包)一些新的 .NET 4.5 程序集(System.Runtime、System.Threading.Tasks),以便它们可以在 4.0 上运行。MSBuild 不喜欢这样,它会导致它相信引用库已经依赖于来自较新框架版本的程序集。Microsoft.Bcl.Build 包中的解决方法解决了这个问题。

于 2013-03-21T21:42:37.220 回答
4

请改用适用于 Visual Studio 11 的 Async Targeting Pack

Install-Package Microsoft.CompilerServices.AsyncTargetingPack

如果您更喜欢使用 Microsoft.Bcl.Async 预发行版,则必须将其添加到所有项目中。Bcl.Async 的下一个版本应该改进消息传递以更好地详细说明。

如果您使用的是 VS 2010,我所知道的唯一能提供 async/wait 的就是 AsyncCTP;因此,在 VS 2010 中使用 Microsoft.Bcl.Async 没有意义。

更新:

WRT 到 Microsoft.Bcl.Async:围绕 MSB 警告的问题(“无法解决......间接依赖......”已知并正在解决。在未来的某些更新(对 MSBuild 和 Microsoft.Bcl.Async)中,这将已修复,您不必在两个项目中都包含 Microsoft.Bcl.Async。

于 2013-03-21T16:32:28.263 回答