【问题标题】:Building ASP.NET-Core 3.1 with .NET-Standard 2.0 projects leads to conflicting Microsoft.AspNetCore.Mvc.Analyzers assemblies使用 .NET-Standard 2.0 项目构建 ASP.NET-Core 3.1 会导致 Microsoft.AspNetCore.Mvc.Analyzers 程序集发生冲突
【发布时间】:2020-02-05 02:39:57
【问题描述】:

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

这在 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.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 块是正确的解决方案吗?

【问题讨论】:

  • 即使在项目文件中添加了<DisableImplicitComponentsAnalyzers>true</DisableImplicitComponentsAnalyzers> 之后,我仍然得到这个。

标签: c# asp.net-core .net-core .net-standard-2.0 asp.net-core-3.1


【解决方案1】:

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

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

【讨论】:

  • 谢谢 Elendil,你对我的第二个问题有答案吗?正确的解决方案是制作一个多目标库吗?
  • 嗨@Daniel,我可以在您的错误消息中看到它说无法加载分析器程序集 C:\Users\daniel\.nuget\packages\microsoft.aspnetcore.mvc.analyzers\2.2.0 \analyzers\dotnet\cs\Microsoft.AspNetCore.Mvc.Analyzers.dll。您可以在此链接docs.microsoft.com/en-us/aspnet/core/migration/… 中看到,从 3.0 开始,隐式引用了 Mvc.Analyzers,因此您可以尝试在链接中指定的 csproj 文件中添加 true
  • 回到你的第二个问题,如果你发现你的依赖是必需的并且在 dotnet build for 3.1 版本中不能被忽略,是的,多目标编译应该可以工作,你可以按照这个链接来构建一个多目标应用程序docs.microsoft.com/en-us/dotnet/core/tutorials/…
  • 感谢 Elendil 的回复。我确实在迁移指南中看到了该注释,但我从未在我的 netstandard20 项目中明确添加 API 分析器,所以我认为我不需要这样做。另外我认为添加另一组分析器会导致更多冲突,但我们会看到!我确实制作了一个多目标库,效果很好!
  • 我使用的最终解决方案是让我的项目多目标。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    半相关,但这个问题是错误 CS8034 的热门搜索结果之一,所以我想为其他人留下答案。就我而言,我们使用不同的分析器遇到了错误:

    CS8034: Unable to load Analyzer assembly C:\...\.nuget\packages\strawberryshake.codegeneration.csharp.analyzers\12.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 项目并且我们的问题消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多