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

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



我在两个项目中都使用此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

最佳答案

摘要:

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

  • 将Microsoft.Bcl.Async程序包安装到引用项目。
  • 将Microsoft.Bcl.Build包安装到引用项目。它包含实际的修复程序,并且仅仅是一个构建时依赖项。执行此操作时,无论项目是类库,Web项目还是可执行文件,您都必须在项目的App.Config中具有适当的绑定(bind)重定向(例如上面列出的内容)。
  • 如果您不希望依赖于任何程序包,请获取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程序包中的解决方法可解决此问题。

    关于c# - 如何正确使用Microsoft.Bcl.Async?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15551953/

    10-17 01:24