netstandard2.0项目启用.NET分析器全部规则不生效问题
netstandard2.0 目标下.NET Roslyn分析器不生效的修复
核心原因
- .NET SDK自带的
EnableNETAnalyzers开关默认只对.NET 5及以上目标框架的项目生效,哪怕在csproj里手动把开关设为true,SDK也不会给netstandard2.0、.NET Framework这类老目标框架的项目注入内置分析器组件。这就是为什么切到net5.0时所有规则正常触发,改回netstandard2.0后分析逻辑直接失效的根本原因。
修复方案
- 手动安装和VS版本、SDK适配的稳定版
Microsoft.CodeAnalysis.NetAnalyzersNuGet包就行。分析器本身是纯编译期组件,运行不依赖项目的目标框架版本,哪怕项目最终编译成netstandard2.0,也能正常跑全量规则校验。 - 按下面的内容调整csproj,配置完成后规则就能正常触发,完全不影响类库被.NET 4.8项目引用的兼容性:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <TreatWarningsAsErrors>true</TreatWarningsAsErrors> <EnableNETAnalyzers>true</EnableNETAnalyzers> <AnalysisMode>AllEnabledByDefault</AnalysisMode> <AnalysisLevel>latest-recommended</AnalysisLevel> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="8.0.0"> <!-- 阻止分析器作为依赖传递给下游项目 --> <PrivateAssets>all</PrivateAssets> <IncludeAssets>analyzers; buildtransitive</IncludeAssets> </PackageReference> </ItemGroup> </Project>
踩坑提醒
- 装分析器NuGet包的时候一定要设
PrivateAssets=all,不然分析器组件会被当成普通依赖传给引用当前netstandard2.0类库的.NET 4.8项目,搞得下游项目全是NuGet还原警告 - 配置完如果还有部分规则不触发,先看SDK版本:低于6.0.300的SDK对netstandard目标下的分析器支持有缺陷,把SDK升到对应稳定版就行,完全不用改项目的目标框架
- 别为了开分析器硬改项目目标框架,分析器只在编译阶段跑,不会对生成的netstandard2.0 dll加任何运行时依赖,和.NET 4.8的引用兼容性完全不受影响
内容的提问来源于stack exchange,提问作者PDufrene
相关产品推荐
相关产品推荐

