【发布时间】: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