C# 检查项目引用的分析器
我想创建一个解决方案来控制C#projects中的项目引用。理想情况下,此解决方案与IDE无关,因此可以与Visual Studio、Jetbrains Rider甚至VS代码一起使用。这是因为我看到的解决方案由于人们创建几乎任意的项目引用而完全混乱。在一个项目发展到一定规模后,要想直接得到它们是非常困难的 我知道visualstudioenterprise提供了这种开箱即用的功能。不幸的是,在我目前的公司里,我们没有VS Enterprise。因此,我想自己创造它 那么,最好的方法是什么呢?在做了一些研究之后,我认为利用.NET编译器平台(“Roslyn”)及其工作区API可能是一个好主意?似乎我可以将其部署为NuGet包,然后可以在任何IDE或构建自动化中使用。但也许有一个更简单或更好的方法,在我开始深入研究之前,我想听听你的意见 另外:如果“Roslyn”方法是正确的,那么关于如何创建与工作区API一起工作的分析器,是否有一些好的资源C# 检查项目引用的分析器,c#,roslyn,roslyn-code-analysis,C#,Roslyn,Roslyn Code Analysis,我想创建一个解决方案来控制C#projects中的项目引用。理想情况下,此解决方案与IDE无关,因此可以与Visual Studio、Jetbrains Rider甚至VS代码一起使用。这是因为我看到的解决方案由于人们创建几乎任意的项目引用而完全混乱。在一个项目发展到一定规模后,要想直接得到它们是非常困难的 我知道visualstudioenterprise提供了这种开箱即用的功能。不幸的是,在我目前的公司里,我们没有VS Enterprise。因此,我想自己创造它 那么,最好的方法是什么呢?在
提前感谢。在分析仪中,注册编译开始操作:
public override void Initialize(AnalysisContext context)
{
context.RegisterCompilationStartAction(Initialize);
}
private void Initialize(CompilationStartAnalysisContext context)
{
var compilation = context.Compilation;
}
从该编译对象中,您有各种选项:
var referencedAssemblyNames = compilation.ReferencedAssemblyNames;
或
然后做你的分析。要报告诊断,请使用上下文在编译StartAnalysisContext
上注册操作。RegisterCompilationEndAction
如果您不需要查看实际的项目内容进行分析,只需使用RegisterCompilationAction
,如下所示:
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class TooManyReferencesAnalyzer : DiagnosticAnalyzer
{
private static DiagnosticDescriptor TooManyReferences { get; } =
new DiagnosticDescriptor(
"DEMO",
"Don't use too many references",
"The project '{0}' has {1} references",
category: "Maintainability",
defaultSeverity: DiagnosticSeverity.Warning,
isEnabledByDefault: true);
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics =>
ImmutableArray.Create(TooManyReferences);
public override void Initialize(AnalysisContext context)
{
context.RegisterCompilationAction(AnalyzeCompilation);
}
private void AnalyzeCompilation(CompilationAnalysisContext context)
{
var compilation = context.Compilation;
int referenceCount = compilation.References.Count();
if (referenceCount > 5)
{
context.ReportDiagnostic(
Diagnostic.Create(
TooManyReferences,
null,
compilation.AssemblyName,
referenceCount));
}
}
}
[DiagnosticanAnalyzer(LanguageNames.CSharp)]
公共密封类TooManyReferencesAnalyzer:DiagnosticanAnalyzer
{
私有静态诊断描述符TooManyReferences{get;}=
新诊断描述符(
“演示”,
“不要使用太多的引用”,
“项目{0}有{1}个引用”,
类别:“可维护性”,
默认严重性:诊断严重性。警告,
IsEnabled默认为:true);
公共覆盖ImmutableArray SupportedDiagnostics=>
创建(TooManyReferences);
公共覆盖无效初始化(AnalysisContext上下文)
{
RegisterCompilationAction(分析编译);
}
私有void分析编译(CompilationAnalysisContext上下文)
{
var compilation=context.compilation;
int referenceCount=compilation.References.Count();
如果(参考计数>5)
{
context.ReportDiagnostic(
诊断。创建(
Toomanyreference,
无效的
compilation.AssemblyName,
参考计数);
}
}
}
Roslyn分析C#,我认为您需要一个分析sln和csproj文件的工具。基本上,您是对的。但是Roslyn提供了工作区API,这应该适合我的需要,不是吗?如果没有,检查项目参考的替代方案是什么?应该让您开始。@SiveAjet谢谢,但是如果我在DiagnosticanAnalyzer中工作,如何获得当前解决方案的引用?诊断分析仪似乎不适合做这种分析。它们似乎只是用于分析C#语法和语义,而不是与项目相关的东西。你必须自己建造它。目前没有任何api可以为您实现这一点。您能给我举个例子吗?我试图创建一个使用RegisterCompilationStartAction(startCtx)注册的分析器,然后在startCtx上注册RegisterCompilationEndAction。StartAction中的代码不断被调用,而EndAction中我可以报告诊断的代码从未被调用。它还说,类似“startCtx”的东西不注册任何分析器操作,除了CompliationEndAction。考虑把这个开始/结束动作对替换为……我感觉到我不知如何理解编译器的动作。也许当一个引用的总数高于一个特定的数字时,你可以提供一个报告错误的例子吗?只是为了说明如何正确使用它。@baumgarb给出了一个例子。
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public sealed class TooManyReferencesAnalyzer : DiagnosticAnalyzer
{
private static DiagnosticDescriptor TooManyReferences { get; } =
new DiagnosticDescriptor(
"DEMO",
"Don't use too many references",
"The project '{0}' has {1} references",
category: "Maintainability",
defaultSeverity: DiagnosticSeverity.Warning,
isEnabledByDefault: true);
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics =>
ImmutableArray.Create(TooManyReferences);
public override void Initialize(AnalysisContext context)
{
context.RegisterCompilationAction(AnalyzeCompilation);
}
private void AnalyzeCompilation(CompilationAnalysisContext context)
{
var compilation = context.Compilation;
int referenceCount = compilation.References.Count();
if (referenceCount > 5)
{
context.ReportDiagnostic(
Diagnostic.Create(
TooManyReferences,
null,
compilation.AssemblyName,
referenceCount));
}
}
}