Dot-Net-Core

無法載入文件或程序集 Microsoft.Extensions.Logging.Abstractions

  • April 27, 2021

我正在使用 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.1.13 到 2.2.4 再次跳過了 2.2.0.0。但是,文件夾“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 版本**。**

如果其他人遇到類似問題,一些資訊和解決方法可能有助於解決難題。

它以奇怪的路徑“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包,所以如果你沒有特定的理由使用那個包,你不需要引用它。

確保您的任何包都不高於項目的 .NET 版本。

在我的情況下,Microsoft.Extensions.Http 的安裝版本是 5.0,而項目在 .NET Core 3.1 中。一旦我將庫降級到 3.1,一切都執行順利。

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

引用自:https://stackoverflow.com/questions/58510301