我在项目中使用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
答案 0 :(得分:23)
<强>摘要强>:
您可以使用以下几种解决方法:
将 Microsoft.Bcl.Async 程序包安装到引用项目中。
将 Microsoft.Bcl.Build 程序包安装到引用项目。这包含实际修复,并且仅仅是构建时依赖性。执行此操作时,您必须在项目的App.Config中具有相应的绑定重定向(例如上面列出的内容) - 无论是类库,Web项目还是可执行文件。
如果您不希望依赖任何包,请获取Microsoft.Bcl.targets文件(随Microsoft.Bcl.Build安装)中的PropertyGroup元素的内容,并将其插入到底部。在最后一个Import元素之后引用项目。
注意:您选择上面的哪个选项,当您发布依赖于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。