【发布时间】:2018-12-11 20:19:34
【问题描述】:
我正在制作一个新的 ASP.NET Core 2.0 项目,本质上是一个 Web API。我必须引用几个 .NET 3.5 程序集的程序集,因此我将其作为 .NET Framework 项目运行,并尽可能使用 .NET Core 改进。
引用的 .NET 框架 3.5 程序集引用了 TaskParallelLibrary (1.0.2856)。我认为这就是我的问题所在。值得注意的是,Web API 在其示例端点上运行,并且一切都按预期运行。
当我运行应用程序并尝试使用引用的库时,调用失败并收到以下异常:
Could not load file or assembly 'System.Threading, Version=1.0.2856.102, Culture=neutral,
PublicKeyToken=31bf3856ad364e35'
or one of its dependencies. The system cannot find the file specified.
我尝试了几件事,包括:
添加一个 App.configx 文件以尝试强制它以 .NET Framework 4 的 System.Threading 为目标,假设该文件可用。灵感来自我找不到链接的页面:
这是内容:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!-- this is only here for binding redirects -->
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Threading" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
直接将该版本的TaskTPLLibrary包添加到项目中。到目前为止,它没有帮助。
将 Microsoft.Bcl.Async 库添加到我的项目中。同样,什么都没有。
尝试从“C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5\System.Threading.dll”直接导入 System.Threading。我收到一条错误消息,指出“引用无效或不受支持。”
我尝试了其他几种方法,包括重新克隆、清洁、重新清洁、大声咒骂并改天再来,但均无济于事。
我的阅读清单包括(在这台电脑上):
- https://github.com/dotnet/corefx/issues/26084
- Could not load file or assembly System.Threading.Tasks, Version=2.5.19.0
- ASP.NET Core 2.0 Site - FileIOException System.Runtime
可能还有一些我不记得了
随着这个问题的继续,一些额外的信息:
- 使用具有相同基础库的 .NET Framework 4.6.2 创建 .NET Framework ASP.NET MVC 应用程序确实有效。它使用中间的 .NET Framework 3.5 间接实现(只是为了方便起见)。
- 直接使用该库的 .NET Framework 4.6.2 控制台应用程序也会遇到此问题。所以它似乎不是 ASP.NET Core 本身。我会相应地更改标签。
- 让 4.6.2 控制台使用中间 3.5 库并不能解决问题。
非常感谢您对解决此问题的任何帮助。
【问题讨论】:
-
TaskParallelLibrary是从哪里来的?它不是 BCL 库。System.Threading是一个核心内置库。你不需要引用它。大多数 TPL 类本身也是核心类。看起来该项目引用了一个不幸的名称TaskParallelLibrary的自定义 dll -
BTW .NET 3.5 没有任务支持。任何提到 Tasks for 3.5 的都是第三方库,看起来就像 TPL。
Microsoft.Bcl.Async只是一个权宜之计,它为 .NET 4.0 应用程序提供了async/await,仅此而已。 -
他们引用了第三方库中的 TPL,我猜是为了在 .NET 框架 3.5 中为他们提供异步/等待支持。查看 NuGet,Microsoft Corporation 是该软件包的作者。我认为它的含义与 Microsoft.Bcl.Async 类似,根据您所说的,只是为了让仍然停留在旧框架上的人们向后移植。您认为这可能是命名冲突吗?
-
@CraigBett 这不是 TPL。这是一个废弃的包,用于创建 一些 类型,看起来像即将推出的 .NET 3.5 的 TPL。它在 2012 年被废弃。它的类不与 .NET 4.0 中的 TPL 类兼容。创建 Microsoft.Bcl.Async 是为了在迁移到 .NET 4.5 和本机 async/await 期间在 .NET 4.0 之上提供 async 功能。它不与
TaskParallelLibrary包一起使用。Microsoft.Bcl.Async本身在 2014 年被废弃,因为不再支持 4.0。最早支持的 .NET 版本是 4.5.2 -
长话短说,
TaskParallelLibrary中的类与 .NET 4.0 及更高版本不兼容,更不用说 .NET Core。值得庆幸的是,它没有在任何 NuGet 包中使用(毕竟这是一个权宜之计)。如果你想迁移到 .NET Core,你必须从任何使用它的项目中删除该库,修复任何不兼容错误(.NET 3.5 实际上是 2.0 加库,而 4.0 是一个新的运行时)并重新编译。跨度>