1. ホーム
  2. .net-core

[解決済み] ファイルまたはアセンブリをロードできませんでした Microsoft.Extensions.Logging.Abstractions

2022-02-12 01:14:45

質問

VS2019 Pro v16.3.5を使用しています。

私は、いくつかのクラスライブラリプロジェクトを参照するAzureファンクションプロジェクトを含むソリューションを持っています。

トップレベルのプロジェクトは、以下のエラーでコンパイルに失敗します。

System.IO.FileNotFoundException: Could not load file or assembly 「Microsoft.Extensions.Logging.Abstractions, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'です。システムが 指定されたファイルが見つかりません。

このプロジェクトにはパッケージリファレンスがあります。 PackageReference Include="Microsoft.AspNetCore.App" このフレームワークには、不足しているDLLが含まれているので、なぜ問題が発生するのかわかりません。

私の考えでは、おそらく参照されているプロジェクトの1つが別のバージョンに依存しているのだと思いますが、私にはそれが見当たりません。

トップレベルのプロジェクトで明示的にパッケージを参照してみましたが、違いはありませんでした。

<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:\Usersbowman_rob_a.nugetpackages にあることが確認できます。しかし、グローバルパッケージフォルダには、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 FilesdotnetsdkNuGetFallbackFolder templatesmicrosoft.extensions.logging.abstractions2.2.0"

共有パッケージの参照に関する問題 v2.2.0.0 は共有パッケージのリファレンス "Microsoft.AspNetCore.App" に含まれているので、そこからアセンブリを引っ張ってくればいいのではないでしょうか?共有パッケージのアセンブリは、"C: \Program Filesdotnet╱shared." にあります。 "Microsoft.AspNetCore.App" が、2.1.13から2.2.4まで、やはり2.2.0.0は飛ばされています。しかし、フォルダ "C:♪Program Filesdotnet♪Microsoft.AspNetCore.App2.2.4♪Microsoft.Extensions.Logging.Abstractions.dll" には、v2.2.0.0のdllが含まれているのです。

バージョンの競合 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につながります - これはShared Framework Microsoft.AspNetCore.Appに含まれているv2.2.0.0より古いです。 誰かコンパイラによって使われる共有枠組みのバージョンをどう変更できるかを知りませんか?私はruntimeconfig.jsonファイルをどこにも見つけることができません!

回避策 私は、ソリューション内のすべてのプロジェクトから共有参照を削除し、必要なnugetパッケージを個別に追加することによって、ソリューションをビルドすることができました - 古い2.1.0バージョンを使用しています。

解決するには?

同じような問題に遭遇した人がいたら、解決できるかもしれない情報と回避策をいくつか紹介します。

<ブロッククオート

変なパスでリストアップされている "C:♪Program Filesdotnet

NuGetFallbackFolder

Microsoft.extensions.logging.abstractions2.2.0"

FallBackFolders は、ユーザーやマシン間でパッケージを共有し、リスクスペースを減らすために使用されるものです。

パッケージソースと異なる点は、パッケージ資産が直接参照され、ユーザーのパッケージフォルダにコピーされないことです。

そのため、Global Packages のような 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 パッケージを使用する特別な理由がない場合は、参照する必要はありません。