【问题标题】:ASP.NET Core referencing TPL NuGet package Cannot Find File or Assembly System.ThreadingASP.NET Core 引用 TPL NuGet 包找不到文件或程序集 System.Threading
【发布时间】: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。我收到一条错误消息,指出“引用无效或不受支持。”

我尝试了其他几种方法,包括重新克隆、清洁、重新清洁、大声咒骂并改天再来,但均无济于事。

我的阅读清单包括(在这台电脑上):

可能还有一些我不记得了

随着这个问题的继续,一些额外的信息:

  • 使用具有相同基础库的 .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 是一个新的运行时)并重新编译。跨度>

标签: .net-4.0 .net-3.5


【解决方案1】:

由于没有合理的答案,我假设引用使用 TaskParallelLibrary 的 .NET 3.5 Framework 库实质上意味着使用 4 以上的任何 .NET 都会导致此错误。在未指定的条件下。大多数时候。

对此的唯一解决方案似乎是将所有内容重写为多目标 .NET 3.5 和 .NET Standard,并让 Standard 实现使用真正的 TPL,让 3.5 使用 NuGet 包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2013-10-08
    相关资源
    最近更新 更多