我可以从 Roslyn 分析器分析上下文获取项目路径或属性吗?

Luk*_*oen 5 c# roslyn roslyn-code-analysis

我正在实现一个 Roslyn 分析器,我想根据 csproj 中某些属性的设置方式采取不同的操作。

目前,我通过在使用分析器导入的 props 文件中设置“AdditionalFiles”节点来实现此目的。这指向 .csproj,然后我手动对项目文件进行 xml 解析,查找我关心的属性。

    <ItemGroup>
      <AdditionalFiles Include="$(ProjectPath)" />
    </ItemGroup>   
Run Code Online (Sandbox Code Playgroud)
        private void AnalyzeAdditionalFiles(CompilationStartAnalysisContext context)
        {
            ICompilationStartAnalysisContextWrapper wrappedContext = this.compilationStartAnalysisContextWrapperFactory.Create(context);

            if (wrappedContext.GetAdditionalTexts()
                              .Any(addtionalFile => <xml parse and validate csproj>))
            {
                context.RegisterSyntaxNodeAction(this.AnalyzeSyntaxNode, PossibleSyntaxKinds);
            }
        }
Run Code Online (Sandbox Code Playgroud)

我被告知可能有一种一流的受支持方法来执行其中一个或两个操作,而不需要感觉像黑客版本的:

  • 找到csproj的路径
  • 从 csproj 获取属性

这可能吗?理想情况下,我会寻找道德上的等价物

AnalysisContext.Project.Properties["MyCustomProp"]
Run Code Online (Sandbox Code Playgroud)

Mét*_*ule 3

从 VS 16.7 预览版 3 开始,现在可以检索一些项目属性。它基于新的 csproj 标签CompilerVisibleProperty您可以在源生成器说明书上找到更多信息,但这里有一个简单的示例。

首先,在 csproj 文件中声明您的属性,并允许分析器访问它:

<!-- declare the property you want to access in your analyzer -->
<PropertyGroup>
    <MyCustomProp>Value from csproj</MyCustomProp>
</PropertyGroup>

<!-- explicitly allow the analyzer to access that variable -->
<ItemGroup>
    <CompilerVisibleProperty Include="MyCustomProp" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过AnalyzerConfigOptionsProvider.GlobalOptions从任何分析器上下文访问此变量。例如:

private static void CompilationStart(CompilationStartAnalysisContext context)
{
  // retrieve the global analyzer options 
  var globalOptions = context.Options.AnalyzerConfigOptionsProvider.GlobalOptions;

  // retrieve the actual build property 
  // -> wanted property name prefixed with "build_property."
  string myCustomProp = null;
  if (!globalOptions.TryGetValue("build_property.MyCustomProp", out myCustomProp))
        myCustomProp = "Default";
}
Run Code Online (Sandbox Code Playgroud)

本示例使用的 Nuget 包:

  • Microsoft.CodeAnalysis.Analyzers 3.3.3
  • 微软.代码分析.CSharp 4.0.1