如何在同.NET Core解决方案中启用自定义Roslyn代码分析器?
解决.NET Core项目中Roslyn分析器引用不生效的问题
我之前也碰到过一模一样的情况——直接加ProjectReference根本没用,因为Roslyn分析器不是普通的项目依赖,得让MSBuild明确知道要把它作为分析器加载,而不是当成普通程序集引用。下面给你一步步拆解解决办法:
第一步:调整分析器项目的配置
首先得把你的Example.Analyzer项目的.csproj配置改对,让它输出符合Roslyn要求的结构:
打开Example.Analyzer.csproj,添加/修改以下内容:
<PropertyGroup> <TargetFramework>netcoreapp3.0</TargetFramework> <IsPackable>true</IsPackable> <PackageId>Example.Analyzer</PackageId> <Version>1.0.0</Version> <!-- 关键标记:告诉MSBuild这是个Roslyn分析器项目 --> <RoslynAnalyzer>true</RoslynAnalyzer> </PropertyGroup> <ItemGroup> <!-- 确保分析器DLL被打包到NuGet的指定目录(后续打包用) --> <None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" /> </ItemGroup>
这个配置不仅标记了项目类型,还为后续打包NuGet包做好了准备。
第二步:正确引用分析器项目
方式一:开发阶段直接引用项目(推荐)
在你要使用分析器的目标项目的.csproj里,添加项目引用时必须指定正确的资产规则,否则分析器不会被加载:
<ProjectReference Include="..\Example.Analyzer\Example.Analyzer.csproj"> <!-- 阻止分析器的依赖被传递到目标项目 --> <PrivateAssets>all</PrivateAssets> <!-- 明确告诉MSBuild要包含分析器资产 --> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </ProjectReference>
添加完之后一定要重启Visual Studio(Roslyn缓存经常会拖后腿),再重新生成整个解决方案。
方式二:打包成NuGet包引用(适合稳定使用/分发)
如果不想一直依赖项目引用,也可以把分析器打包成NuGet包:
- 进入
Example.Analyzer项目目录,运行命令:dotnet pack -c Release - 生成的
.nupkg文件会在bin/Release目录下 - 把这个包添加到本地NuGet源,或者直接在目标项目里通过本地文件引用它
这种方式下Roslyn会自动识别并加载NuGet包里的分析器,不需要额外配置。
第三步:验证分析器是否生效
可以用两种方式确认:
- 在目标项目里写一段触发你自定义规则的代码,比如违反规则的写法,看看Visual Studio的错误列表里会不会出现对应的警告/错误
- 用命令行运行
dotnet build,查看输出日志,里面应该会有分析器输出的诊断信息
另外补充个小细节:确保Example.Analyzer引用的Roslyn相关包(比如Microsoft.CodeAnalysis.CSharp、Microsoft.CodeAnalysis.Analyzers)版本和目标项目的.NET Core 3.0兼容,版本不匹配也可能导致分析器不生效。
内容的提问来源于stack exchange,提问作者Zenexer




