bau*_*arb 1 c# roslyn roslyn-code-analysis
我想创建一个解决方案,用于控制C#项目中的项目引用。理想情况下,此解决方案与IDE无关,因此可以与Visual Studio,Jetbrains Rider甚至VS Code一起使用。这样做的原因是,由于人们创建了几乎任意的项目引用,所以我看到的解决方案被完全弄乱了。在项目发展到一定规模后,要使它们变得直立是非常困难的。
我知道Visual Studio Enterprise提供了开箱即用的功能。不幸的是,在我目前的公司中,我们没有VS Enterprise。因此,我想自己创建一个。
那么什么是最好的方法呢?经过研究后,我认为将.NET编译器平台(“ Roslyn”)与Workspace API结合使用可能是一个好主意?似乎我可以将其部署为NuGet软件包,然后可以在任何IDE或自动生成中使用。但是,也许有一种更简便或更好的方法,在开始研究之前,我想听听您的意见。
另外:如果“ Roslyn”方法正确,那么在如何创建与Workspace API一起使用的分析器方面是否有一些好的资源?
提前致谢。
在您的分析器中,注册一个编译开始操作:
public override void Initialize(AnalysisContext context)
{
context.RegisterCompilationStartAction(Initialize);
}
private void Initialize(CompilationStartAnalysisContext context)
{
var compilation = context.Compilation;
}
Run Code Online (Sandbox Code Playgroud)
在该编译对象中,您有多种选择:
var referencedAssemblyNames = compilation.ReferencedAssemblyNames;
Run Code Online (Sandbox Code Playgroud)
要么
var references = compilation.References;
Run Code Online (Sandbox Code Playgroud)
然后进行分析。要报告诊断,登记上的操作CompilationStartAnalysisContext使用context.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));
}
}
}
Run Code Online (Sandbox Code Playgroud)