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)
我被告知可能有一种一流的受支持方法来执行其中一个或两个操作,而不需要感觉像黑客版本的:
这可能吗?理想情况下,我会寻找道德上的等价物
AnalysisContext.Project.Properties["MyCustomProp"]
Run Code Online (Sandbox Code Playgroud)
从 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 包:
| 归档时间: |
|
| 查看次数: |
1439 次 |
| 最近记录: |