使用 .NET-Standard 2.0 项目构建 ASP.NET-Core 3.1 会导致 Microsoft.AspNetCore.Mvc.Analyzers 程序集冲突

Building ASP.NET-Core 3.1 with .NET-Standard 2.0 projects leads to conflicting Microsoft.AspNetCore.Mvc.Analyzers assemblies

我正在尝试构建一个 ASP.NET-Core 3.1 (netcoreapp3.1) 应用程序,它依赖于 .NET-Standard 2.0 使用 MSBuild SDK "Microsoft.NET.Sdk.Razor" 的 NuGet 库。

从 Visual Studio (2019) 开始构建并且 运行 没问题,但是当我 运行 dotnet build 我收到以下错误:

Build FAILED.

CSC : error CS8034: Unable to load Analyzer assembly 
 C:\Users\daniel\.nuget\packages\microsoft.aspnetcore.mvc.analyzers.2.0\analyzers\dotnet\cs\Microsoft.AspNetCore.Mvc.Analyzers.dll
 : Assembly with same name is already loaded [D:\git\myapp\src\myapp.App\myapp.App.csproj]
    0 Warning(s)
    1 Error(s)

我的猜测是我的 .NET-Standard 2.0 库正在通过 Microsoft.NET.Sdk.Razor SDK 引入 Microsoft.CodeQuality.Analyzers 2.x,这与 ASP.NET-Core 3.1申请。

问题:

  1. 有没有办法像Visual Studio一样通过命令行构建我的应用程序?

  2. 在我的库中使用多目标和 #if NETCOREAPP3_1 块是正确的解决方案吗?

visual studio 使用 MSBuild 构建您的解决方案文件,因此您可以尝试 MSBuild %yoursolutionfile% 构建您的解决方案,另一方面,dotnet build 通常构建单个项目而不是解决方案.

回答你的第二个问题,如果你确实发现你的依赖是必需的,并且在 3.1 版本的 dotnet build 中不能被忽略,是的,多目标设置应该可以工作,你可以按照这个 link 来构建多目标应用程序 https://docs.microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-multitarget

这是隐藏烦人消息的解决方法,但实际上并不能解决根本问题:

编辑 .csproj 并将 8034 (CS8034) <NoWarn> 添加到 Configuration/Platform <PropertyGroup>,如下所示:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <!-- ... -->
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <NoWarn>8034</NoWarn>
  </PropertyGroup>

  <!-- ... -->
</Project>

半相关,但此问题是错误 CS8034 的热门搜索结果之一,因此我想为其他人留下答案。在我的例子中,我们 运行 使用不同的分析器进入错误:

CS8034: Unable to load Analyzer assembly C:\...\.nuget\packages\strawberryshake.codegeneration.csharp.analyzers.0.1\analyzers\dotnet\cs\Microsoft.CodeAnalysis.CSharp.dll

我们在 .NetStandard2.0 项目上安装了 StrawberryShake,该项目由 .Net 3.1 sdk 构建。但是,StrawberryShake 使用与 .Net 5 一起发布的 Roslyn 源代码生成器。下游依赖于我们 StrawberryShake 代码的 csprojs 无法编译,表示该程序集没有我们生成的任何名称空间/类型。我们升级到 .Net 5 来​​构建 StrawberryShake 项目,我们的问题消失了。