首页 > 解决方案 > 如何使用 Roslyn 分析器验证 Projects 属性默认命名空间

问题描述

我想验证仅在项目中可见的属性,这是编译操作的默认命名空间值。我能够找到验证项目引用的能力,但这不提供读取默认项目命名空间的选项。

是否可以使用 Roslyn Analyzer?

编辑:我发现在编译开始期间有一些可用的属性,但这并没有提供想要的信息:

context.Compilation.GlobalNamespace.IsNamespace > returns true
context.Compilation.GlobalNamespace.IsGlobalNamespace > returns true
context.Compilation.GlobalNamespace.Name > returns ""
context.Compilation.GlobalNamespace.ToDisplayString() > returns "<global namespace>"

我知道我可以去每个类并检查命名空间,但事实并非如此,因为我想知道默认项目的命名空间。一个例子:项目名称=“Project.UnitTests”,程序集=“Project.UnitTests”,默认命名空间是“Project.UnitTest”。默认命名空间与项目不匹配,因为项目名称是复数,命名空间是单一含义。

标签: c#roslynanalyzer

解决方案


就我而言,它适用于 C# Source Generator,而不适用于 Analyzer,但无论如何我成功地在我的源生成器中获取了目标项目的根命名空间。

详细文档在这里:

https://github.com/dotnet/roslyn/blob/main/docs/features/source-generators.cookbook.md#consume-msbuild-properties-and-metadata

首先,您必须<CompilerVisibleProperty>在目标项目文件的项目组中声明项目(它不是源生成器项目文件),以允许您的源生成器检索指定的 MSBUild 属性值。在这种情况下,您应该指定RootNamespace属性。

...
<!-- This is the target application's .csproj file -->
<ItemGroup>
  <CompilerVisibleProperty Include="RootNamespace" />
</ItemGroup>
...

之后,您可以通过如下代码获取根命名空间,而不是引用context.Compilation.GlobalNamespace.

...
// This is C# Source Generator's .cs file.
[Generator]
public class MySourceGenerator : ISourceGenerator
{
    public void Execute(GeneratorExecutionContext context)
    {
        context.AnalyzerConfigOptions.GlobalOptions.TryGetValue("build_property.RootNamespace", out var rootNamespace);
        ...

我不确定这段代码是否也适用于 C# Analyzor,但我希望这些信息对您有所帮助。


推荐阅读