无法加载文件或程序集Microsoft.Extensions.Logging.Abstractions。

33

我使用的是VS2019 Pro v16.3.5。

我有一个解决方案,其中包含一个引用了多个类库项目的Azure函数项目。

顶级项目无法编译,出现以下错误:

System.IO.FileNotFoundException: 找不到文件或程序集“Microsoft.Extensions.Logging.Abstractions,Version=2.2.0.0,Culture=neutral,PublicKeyToken=adb9793829ddae60”。系统找不到指定的文件。

该项目确实具有软件包引用:PackageReference Include="Microsoft.AspNetCore.App",而此框架包括缺失的dll,因此我不知道为什么会出现问题。

我的想法是,可能是其中一个被引用的项目依赖于不同的版本,但我没有看到它。

我尝试在顶级项目中明确引用该软件包,但没有任何改变:

<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0.0" />

这是当前的顶层csproj文件副本:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <AzureFunctionsVersion>v2</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Base.Core.SharedKernel" Version="1.0.0.23885" />
    <PackageReference Include="FluentValidation" Version="8.4.0" />
    <PackageReference Include="FluentValidation.AspNetCore" Version="8.4.0" />
    <PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="7.0.0" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions" Version="3.0.2" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="1.8.2" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="3.0.5" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.27" />
    <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\Interfaces.Avaloq.Application\Interfaces.Avaloq.Application.csproj" />
    <ProjectReference Include="..\Interfaces.Avaloq.Common\Interfaces.Avaloq.Common.csproj" />
    <ProjectReference Include="..\Interfaces.Avaloq.Infrastructure\Interfaces.Avaloq.Infrastructure.csproj" />
    <ProjectReference Include="..\Interfaces.Avaloq.Persistence\Interfaces.Avaloq.Persistence.csproj" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

引用Nuget包时出现问题 我可以看到“工作中”的包引用(如FluentValidation.dll)的程序集可以在全局包文件夹“C:\Users\bowman_rob_a.nuget\packages”中找到。然而,全局包文件夹中没有包含Microsoft.Extensions.Logging.Abstractions的v2.2.0.0版本,它包含了很多版本但是从2.1.0跳到了3.0.0。

如果我从包管理器控制台运行:“install-package Microsoft.Extensions.Logging.Abstractions -Version 2.2.0”,那么我会得到以下错误:

WriteObject和WriteError方法不能从BeginProcessing、ProcessRecord和EndProcessing方法之外调用,并且只能从同一线程内调用

尽管出现错误,该软件包仍将出现在解决方案资源管理器中项目的软件包部分。但是,它列在一个奇怪的路径下“C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.extensions.logging.abstractions\2.2.0”。

共享包引用问题 因为v2.2.0.0包含在共享包引用“Microsoft.AspNetCore.App”中,那么我想装配件应该从那里拉取? 共享包的程序集位于“C:\ Program Files \ dotnet \ shared”中。共享包“Microsoft.AspNetCore.App”有很多版本,但是2.2.0.0也被跳过了,从2.1.13到2.2.4。然而,“C:\ Program Files \ dotnet \ shared \ Microsoft.AspNetCore.App \ 2.2.4 \ Microsoft.Extensions.Logging.Abstractions.dll”文件夹包含dll的v2.2.0.0版本。

版本冲突 我认为问题的根本原因可能是Azure Functions具有对nuget软件包链的依赖:Microsoft.Azure.WebJobs.Extensions -> Microsoft.Azure.WebJobs -> Microsoft.Extensions.Logging.Abstractions。 Microsoft.Azure.WebJobs.Extensions的最新版本是3.0.2,这导致v2.1.0的Microsoft.Extentions.Logging.Abstractions降级 - 这比包含在共享框架Microsoft.AspNetCore.App中的v2.2.0.0要旧。是否有人知道如何更改编译器使用的共享框架的版本? 我找不到runtimeconfig.json文件!

解决方法 我已经能够通过从解决方案中所有项目中删除共享引用并逐个添加每个所需的nuget软件包来使解决方案构建 - 使用较旧的2.1.0版本。


在错误出现之前的构建过程中,您是否收到任何警告? - Alex Buyny
你好朋友,你选择了哪个模板?据我所知,在VS中创建Azure函数项目时,我们可以选择不同的模板。如果您能分享更多关于顶级项目和其他库项目使用的NuGet包的详细信息,以及库项目的目标框架是.NET Core还是.NET Standard,那就更好了。 - LoLance
1
嗨@LanceLi-MSFT,我现在已经添加了顶级csproj。 - Rob Bowman
嗨@AlexBuyny,没有警告。我的构建详细程度设置为“详细”。 - Rob Bowman
@BowmanZhu 请查看问题的最后一段。 - Rob Bowman
10个回答

32

9

以下是一些信息和解决方法,如果其他人遇到类似问题可能会有所帮助。

它列在一个奇怪的路径"C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.extensions.logging.abstractions\2.2.0"中

FallBackFolders 是用于在用户和机器之间共享软件包以减少风险空间的东西。

它们不同于包源,因为包资产将被直接引用,并且不会被复制到用户的包文件夹中。

这就是为什么你不能在全局包中找到该软件包,例如 C:\Users\xxx\.nuget\packages

对于 版本冲突

正如你上面提到的那样,Microsoft.Azure.WebJobs.Extensions 的链路是:

Microsoft.Azure.WebJobs.Extensions --> Microsoft.Azure.WebJobs --> Microsoft.Extensions.Logging.Abstractions(2.1.0)

由于您引用了Microsoft.AspNetCore.App包,因此它的链:

Microsoft.AspNetCore.App(2.2.0) --> Microsoft.Extensions.Logging.Abstractions(2.2.0)

我认为这可能是版本冲突的原因。您可以删除该软件包,以检查是否有其他解决方法。

另外:

如果我在VS16.3.5中创建新的Azure Function项目,则无需手动引用这些软件包:

    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions" Version="3.0.2" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="1.8.2" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="3.0.5" />
    <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />

由于Microsoft.NET.Sdk.Functions依赖于这些包,因此NuGet将帮助我们下载并引用它们。

我尝试了几种Azure函数项目,但它们都不需要Microsoft.AspNetCore.App包,所以如果您没有特定的原因来使用该包,您就不需要引用它。


6

我正在使用VS2022尝试运行funcapp的httptrigger函数。我将Microsoft.Extensions.Http从7.0.0降级到了6.0.0,将Microsoft.Extensions.Logging.Abstractions降级到了6.0.3。这样做可以正常工作。


将 Microsoft.Extensions.Logging.Abstractions 和 Microsoft.Extensions.Configuration.Abstractions 从 7.0.0 降级到 6.0.0 对我也起了作用。 - Pat
这对我也起作用了。喜欢做这些变通的事情,因为微软无法完全记录或测试任何东西。 - Quiver
我最终也将 Microsoft.Extensions.Http 从 7.0.0 降级到了 6.0.0。我的 Azure Function 目标是 .net6.0,而这个版本支持 Microsoft.Extensions.Http 7.0.0。看起来像是一个 bug。 - dybzon
我最终也将 Microsoft.Extensions.Http 从 7.0.0 降级到了 6.0.0。我的 Azure Function 目标是 .net6.0,而 Microsoft.Extensions.Http 7.0.0 是支持的。看起来像是一个 bug。 - undefined
这也帮助了我。在我的情况下,我有一个计时器触发函数,它依赖于另一个包含 EF Core 的项目。将依赖项目降级到 EF Core 6.0.22 版本使我能够将 Microsoft.Extensions.Logging.Abstractions 降级到 6.0.3 版本。这解决了我的问题。 - undefined
对于任何想知道如何降级传递包版本的人,可以使用Nuget包管理器将其安装为根级包,以定位到较旧的版本。我还需要在我的csproj文件的PropertyGroup中添加属性<TreatWarningsAsErrors>false</TreatWarningsAsErrors>以抑制Nuget警告。 - undefined

3

我刚使用 .net 6 创建了一个新项目,但遇到了这个问题。

我安装了 Entity Framework 的 NuGet 包:

Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCore.Tools

以支持对 SQL 数据库的数据访问。

这两个库默认使用最新版本的 .net 7。

以下是我遇到的错误:

[2023-01-16T18:15:16.759Z] No job functions found. Try making your job classes and methods public. If you're using binding extensions (e.g. Azure Storage, ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. builder.AddAzureStorage(), builder.AddServiceBus(), builder.AddTimers(), etc.).
[2023-01-16T18:15:16.790Z] The 'Function1' function is in error: Could not load file or assembly 'Microsoft.Extensions.Logging.Abstractions, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified.

即使将项目更改为.net 7也无法解决此问题,尽管我想知道是否需要更新所有nuget包到7。我不得不将这两个库降级到.net 6,然后它编译并运行良好。
无论如何,我希望保持长期支持的6版本。现在唯一的麻烦是,nuget想要升级这两个库到.net 7,因此它们显示为可以升级。

我也遇到了同样的问题。不过,我真的想要将EF Core 7与net6.0 LTS保持在一起,因为“EF7的目标是.NET 6,因此可以与.NET 6(LTS)或.NET 7一起使用。”https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew - Collin Barrett
嗨,这方面有更新吗?我自己也遇到了这个问题。我开始感到很烦恼了。 - Michael Tucker
我上面所做的对我来说解决了这个问题。我也在微软的错误报告中找到了相关信息,因此微软已经意识到了这个问题。 - Zonus

3
我在使用 Azure Functions 的 v4 版本时遇到了这个问题。解决它的方法是编辑 .csproj 文件并添加以下代码到 <PropertyGroup> 中: <_FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput>

1
太棒了!你让我的一天过得很愉快! - nicolattu
请问您能提供这些信息的来源参考吗? - undefined
@AdrianBhagat 我不确定你为什么需要这个?试一试,看看对你是否有用。我解决这类问题通常是通过谷歌我的错误信息,但很多个月后我已经不记得是什么提示我尝试这种方法了。我确实看了这个帖子,想分享一下对我解决问题有帮助的方法。 - undefined
如果你要发布一段“神奇”的代码,最好的做法是展示它的来源,这样人们可以更多地了解它,理解它的原理和工作方式,并了解它可能产生的其他意外效果。它可能解决了手头的问题,但也可能产生了其他10个无法修复的问题,因为开发者不知道它们是如何引起的。 - undefined

3

如果遇到 Azure Function V4 的问题,降级到 Microsoft.* 6 版本库可以解决问题。

对这些依赖项的支持仅限于 6.0.0。这是在 .NET 6 上运行的 V4 中进程模型的限制。

如果这是一个要求,建议转移到隔离模型,其中 .NET 依赖项不受限制/统一。


2

我在升级Nuget包后出现了这个问题,然后又回退。在它再次工作之前,必须手动删除解决方案中的所有bin和obj文件夹。清理解决方案没有帮助。


对我来说运行了!之前我一直在一个版本落后的分支上工作。在切换到更新包的分支后开始出现这个错误。 - Anepicpastry

1

我曾经遇到过类似的问题,运行Windows服务时必须使用重定向技术更新配置文件中新可用版本,并成功解决了这个问题。

<configuration>
<appSettings />
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.Extensions.Logging" publicKeyToken="adb9793829ddae60" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.Extensions.Primitives" publicKeyToken="adb9793829ddae60" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>
</configuration>


0

我在Azure DevOps编译的WebJob项目中,与Azure WebApp一起运行时遇到了同样的问题。

我通过在构建管道中将“使用 .Net Core”任务版本更改为最新版本(3.1.x)来解决了这个问题。 enter image description here

这是错误消息: 未处理的异常。System.IO.FileLoadException: 无法加载文件或程序集'Microsoft.Extensions.Logging.Abstractions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=……'。所定位的程序集清单定义与程序集引用不匹配。(……)


0
在我的情况下,VS2022在project.csproj文件中添加了一些额外的代码,这些代码试图引用一个旧版本的Nuget包,而实际上已经使用了更新的版本。一旦将这些代码删除,项目就可以正确编译了。

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