无法加载System.Threading.Tasks.Extensions

44

我有一个基于 .net framework 4.5.1 的 Web 项目,我们正在尝试为该项目添加 PostgreSQL 支持。使用 Nuget,我已经将 4.0.4 npgsql 安装到了该项目中,在引用中,我看到以下内容被添加到了项目中:

  1. Npgsql - 4.0.4.0 - 运行时版本 v4.0.30319
  2. System.Threading.Tasks.Extensions - 4.2.0.0 - 运行时版本 v4.0.30319

当我尝试运行该项目并连接数据库以获取数据时,我收到了以下错误提示:“FileNotFoundException”。

    System.TypeInitializationException
      HResult=0x80131534
      Message=The type initializer for 'com.rsol.RConfig' threw an exception.
      Source=RConfig
      StackTrace:
       at com.rsol.RConfig.getInstance() in C:\Workspaces\PS\RConfig\RConfig.cs:line 1113
       at RAdmin.Global.Application_Start(Object sender, EventArgs e) in C:\Workspaces\PS\RAdmin\Global.asax.cs:line 528

    Inner Exception 1:
    TypeInitializationException: The type initializer for 'com.rsol.Db.DbMgr' threw an exception.

    Inner Exception 2:
    FileNotFoundException: Could not load file or assembly 'System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system cannot find the file specified.

    Inner Exception 3:
    FileNotFoundException: Could not load file or assembly 'System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system cannot find the file specified.

使用Nuget安装的System.Threading.Tasks.Extensions未能加载到项目中。当我检查System.Threading.Tasks.Extensions引用的属性时,dll文件存在于该位置。我还尝试使用gacutil将System.Threading.Tasks.Extensions.dll文件安装到程序集中。但是我仍然遇到相同的错误。

如果您需要任何其他信息,请告诉我。

真的很感谢任何帮助。


异常来自静态或类型初始化器。这是一个不应该抛出异常的部分,因为它会导致调试困难。请注意,它说的是文件本身 - 以两个版本 - 或其中一个依赖项。因此,有90%的可能性是两个版本都使用的某个依赖项引起的。 - Christopher
参考资料,这是“Npgsql”中的一个公开错误,正在此处讨论:https://github.com/npgsql/npgsql/issues/2677。该线程中讨论了该问题的原因和几种解决方法。 - mark.monteiro
10个回答

58

在我的情况下,我在升级到4.5.4版本后遇到了这个问题,并尝试了@user2713341的答案。它没有起作用,但是让我朝着正确的方向前进了一步。

我的项目没有这个库的绑定,所以我添加了绑定并且它运行良好。

<dependentAssembly>
  <assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>

它起作用了。

请注意,尽管版本为4.5.4,但应该是4.2.0.1。


3
我尝试显式安装4.5.4版本,并使用'<bindingRedirect oldVersion ="0.0.0.0-4.5.4" newVersion ="4.5.4" />',但出于某种原因,这并没有起作用。 但是您的答案对我起了作用,非常感谢 :) - RobJohnson
1
Nuget包显示版本号为4.5.4。DLL本身的文件版本为4.6.28619.1,而你的程序集绑定重定向到4.2.0.1,在一些SpecFlow测试无法运行后,这个重定向对我有效。虽然没有道理,但感谢你的建议——使用4.2.0.1绑定重定向是正确的方法。在VS 2019和Specflow 2019测试中进行了测试。 - Tore Aurstad
3
@ToreAurstad,实际上,System.Threading.Tasks.Extensions v4.5.4 版本中 DLL 的版本号是 4.2.0.1。您可以在此手动检查 nupkg 链接。似乎由于某种原因,微软正在以 Nuget 和 DLL 之间不一致的版本号发布 Nuget 包。只有上帝知道为什么。 - scharnyw
救命稻草!谢谢。 - Samy Sammour
谢谢!显然,Nuget版本与程序集版本不同。我们可以在此处检查程序集版本(https://nuget.info/packages/System.Threading.Tasks.Extensions/4.5.4)。 - Sahitya
在我的情况下,一些缺失的 DLL 甚至没有 <dependentAssembly> 条目。使用 <bindingRedirect> 添加它们解决了问题。 - Sven Möhring

23

2
在我的情况下,这个“更新”解决了问题,但我不得不降级它。 - moarra
2
在我的情况下,Npgsql 特别要求版本 4.2.00。版本 4.5.3 是问题所在。 - Doug Kimzey

11

更新Nuget包对我没有起作用。

什么是有效的? 在app.config中需要更改

<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />

为了

<bindingRedirect oldVersion="0.0.0.0-4.5.4" newVersion="4.5.4" />

对于当前版本4.7.2应该可以工作。

就像微软一样 ;)


我觉得这个回答很傻,因为在我的开发环境中,oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" 是正确的解决方案...但是!...它在我的暂存环境中不起作用,所以我尝试了 oldVersion="0.0.0.0-4.5.4" newVersion="4.5.4",它奏效了...但是怎么做到的呢?显然我太蠢了:D - Jimbo
3
4.5.4 是“包”的版本号。4.2.0.1 是“程序集”的版本号。绑定重定向只对“程序集”版本有效。 - Frank Shearar
@FrankShearar - 这就是我认为这是一个愚蠢的答案的原因,但事实证明这个答案是正确的。 <bindingRedirect oldVersion="0.0.0.0-4.5.4" newVersion="4.5.4" /> 是解决方案(我现在已经在四个不同应用程序的生产环境中使用了它)。 - Jimbo

2

当我尝试使用Entity Framework Core(EFC)版本3.1.8的程序包管理器控制台进行迁移时,出现了不同环境下的错误。项目已成功构建。

尝试按照本主题中建议的绑定重定向以及重新安装不同版本的System.Threading.Tasks.Extensions和EFC(正如其他地方建议的那样),但这些方法对我都没有起作用。

我通过以下方式解决了问题:

  • 删除项目根目录下的packages/目录
  • 通过Visual Studio使用手动NuGet Package Restore(链接到Microsoft Docs)

2

@Keyjote的回复对我解决问题很有帮助,但我并没有挑选程序集,而是重新安装了一下。这似乎自动修复了app.config文件。

工具 -> Nuget程序包管理器 -> 程序包管理器控制台

Update-Package -reinstall -Project <your project name>

这样就不需要去处理语法,也不需要弄清楚PublicKeyToken的值。

如果您想为整个解决方案执行此操作,则可以省略-Project <>参数。


1
问题出在*.csproj文件上。因为该dll未加载,所以对System.Threading.Tasks.Extensions.4.5.4的引用有误。 在从lib中引用正确的框架版本文件夹后,它开始正常工作。 旧引用:
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll</HintPath>
    </Reference>
corrected one:

<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net472\System.Threading.Tasks.Extensions.dll</HintPath>
    </Reference>

请先清除NuGet缓存,然后运行测试用例,它将起作用。


0

我一直在苦苦挣扎绑定重定向的问题。 最终,我找到了一个真正的陷阱,解决了我的问题。

我有一个 .net 4.8 的 WCF 服务器项目,依赖于 .net standard 2.0 的项目。

我正在更新被引用项目中的 Nuget 包。 我遇到了各种各样的问题,这里不再赘述。

我在 web.config 中设置了 bindingRedirects。我必须重新发现这些是不必要的,甚至可能会产生冲突,因为它们会自动生成到 dll.config 中。有各种各样的方面需要考虑,可以在其他地方看到。

但对我来说真正的陷阱是,对于 IIS,我必须将 web.config 链接到 dll.config。后者是完整的配置文件,包含所有的 bindingRedirects,结果证明这样做是有效的。


这并没有真正回答问题。如果你有不同的问题,可以点击提问来提问。如果想要在这个问题得到新的回答时收到通知,你可以关注这个问题。一旦你有足够的声望,你也可以添加赏金以引起更多关注。- 来自审核 - Dan

0
这个错误发生在我尝试使用Resharper运行测试时。 结果发现我在Resharper测试运行器设置中为测试运行器选择了一个错误的配置文件(来自另一个项目): enter image description here

-1

我收到了类似的错误信息,但原因不同。在NUGET管理器中设置packages.config时,有一个新版本的引用 - 但在项目引用中有一个旧版本的引用。解决方案是删除项目引用中的引用。


-1

尝试下载该软件包并显式地将其添加到您的项目中。应该可以工作,我已经解决了这个问题。


虽然这是一个可能的解决方案,但当涉及到许多Nuget包及其所有依赖项时,它是不可持续的。从长远来看,最好的解决方案仍然是使用Nuget Package系统,而非避免它。 - sɐunıɔןɐqɐp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接