我想创建一个控制C#项目中项目引用的解决方案。理想情况下,此解决方案与IDE无关,因此可以与Visual Studio,Jetbrains Rider甚至VS Code一起使用。这样做的原因是,由于人们创建了几乎任意的项目引用,我已经看到完全混乱的解决方案。在项目增长到一定规模后,很难让他们直截了当。
我知道Visual Studio Enterprise提供了开箱即用的功能。不幸的是,在我目前的公司,我们没有VS Enterprise。因此,我想自己创造它。
那么最好的方法是什么?在做了一些研究后,我认为利用 .NET编译器平台(" Roslyn")及其Workspace API可能是一个好主意?好像我可以将它部署为NuGet包,然后可以在任何IDE或构建自动化中使用它。但也许有更简单或更好的方式,在我开始深入研究之前,我想听听你的意见。
另外:如果" Roslyn" -way是正确的,那么有一些关于如何创建与Workspace API一起使用的分析器的良好资源吗?
提前致谢。
答案 0 :(得分:3)
在分析仪中,注册编译开始操作:
public override void Initialize(AnalysisContext context)
{
context.RegisterCompilationStartAction(Initialize);
}
private void Initialize(CompilationStartAnalysisContext context)
{
var compilation = context.Compilation;
}
从该编译对象中,您有多种选择:
var referencedAssemblyNames = compilation.ReferencedAssemblyNames;
或
var references = compilation.References;
然后进行分析。要报告诊断,请使用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));
}
}
}