【问题标题】:Could not load file or assembly Microsoft.Extensions.Logging.Abstractions无法加载文件或程序集 Microsoft.Extensions.Logging.Abstractions
【发布时间】:2020-02-18 23:02:23
【问题描述】:

我正在使用 VS2019 Pro v16.3.5

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

顶级项目编译失败,报以下错误:

System.IO.FileNotFoundException:无法加载文件或程序集 'Microsoft.Extensions.Logging.Abstractions,版本=2.2.0.0, 文化=中性,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,这导致 Microsoft.Extentions.Logging.Abstractions 的 v2.1.0 - 这比 Microsoft 共享框架中包含的 v2.2.0.0 旧。 AspNetCore.App。有谁知道我如何更改编译器使用的共享框架的版本?我在任何地方都找不到 runtimeconfig.json 文件!

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

【问题讨论】:

  • 在错误发生之前,您在构建过程中是否收到任何警告?
  • 您好朋友,您选择的模板是什么?据我所知,在 VS 中创建 Azure 函数项目时,我们可以选择不同的模板。如果你能分享更多关于你的顶级项目和其他库项目使用的 nuget 包的详细信息,以及你的库项目的目标框架是什么,.net core 或 .net 标准?
  • 嗨@LanceLi-MSFT 我现在已经添加了顶级csproj
  • 嗨@AlexBuyny 没有警告。我已将详细程度设置为“详细”
  • @BowmanZhu 请看问题的最后一段

标签: .net-core msbuild nuget azure-functions visual-studio-2019


【解决方案1】:

确保您的所有包都不高于项目的 .NET 版本。

在我的情况下,Microsoft.Extensions.Http 的安装版本是 5.0,而项目在 .NET Core 3.1 中。一旦我将库降级到 3.1,一切都运行顺利。

来源:https://github.com/Azure/azure-functions-core-tools/issues/2304

【讨论】:

    【解决方案2】:

    我在 Azure DevOps 中编译并使用 Azure WebApp 运行的 WebJob 项目中遇到了同样的问题。

    我已通过将“使用 .Net Core”任务版本更改为构建管道中的最新版本 (3.1.x) 来解决问题。

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

    【讨论】:

      【解决方案3】:

      如果其他人遇到类似问题,一些信息和解决方法可能有助于解决难题。

      它以奇怪的路径“C:\Program”列出 Files\dotnet\sdk\NuGetFallbackFolder\microsoft.extensions.logging.abstractions\2.2.0"

      FallBackFolders 用于在用户和机器之间共享包以减少风险空间。

      它们与包源的不同之处在于包资源将被直接引用,不会被复制到用户的包文件夹中。

      这就是为什么你在像C:\Users\xxx\.nuget\packages这样的全局包中找不到包的原因。

      对于Version Conflict

      正如你上面提到的,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包,所以如果你没有特定的理由使用那个包,你不需要引用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-17
        相关资源
        最近更新 更多