如何使用Microsoft.Bcl.Async吧?

时间:2013-03-21 15:40:33

标签: c# wpf asynchronous .net-4.0 async-await

我在项目中使用Microsoft.Bcl.Async package,而该项目是由另一个不使用异步功能的项目引用的。

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

  

无法解析主要参考“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

2 个答案:

答案 0 :(得分:23)

<强>摘要

您可以使用以下几种解决方法:

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

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

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

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

    长篇故事

    正如彼得所指出的,这是一个已知的问题,只有Microsoft.Bcl.Async而不是Microsoft.CompilerServices.AsyncTargetingPack,因为它们的设计方式。

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

答案 1 :(得分:4)

请改用Async Targeting Pack for Visual Studio 11

Install-Package Microsoft.CompilerServices.AsyncTargetingPack

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

如果您正在使用VS 2010,我所知道的唯一能让您同步/等待的是AsyncCTP;因此,在VS 2010中使用Microsoft.Bcl.Async是没有意义的。

更新

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