如何在Roslyn分析器中获取给定或当前编译的已定义预处理器符号
在Roslyn分析器中获取预处理器符号的方法
获取当前编译的已定义预处理器符号
在Roslyn分析器里,你可以通过Compilation对象的CompilationOptions属性拿到当前编译的预处理器符号。一般在Initialize方法中注册CompilationStartAction,就能获取当前编译的上下文:
public override void Initialize(AnalysisContext context) { context.EnableConcurrentExecution(); context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); context.RegisterCompilationStartAction(compilationContext => { // 获取当前编译的预处理器符号集合 var preprocessorSymbols = compilationContext.Compilation.Options.PreprocessorSymbolNames; // 遍历所有符号 foreach (var symbol in preprocessorSymbols) { // 示例:输出符号到诊断信息 compilationContext.ReportDiagnostic(Diagnostic.Create( Rule, Location.None, $"已定义预处理器符号: {symbol}")); } // 检查是否包含特定符号 if (preprocessorSymbols.Contains("DEBUG")) { // 执行DEBUG模式专属逻辑 } }); }
PreprocessorSymbolNames返回ImmutableHashSet<string>,包含当前编译所有已定义的预处理器符号(涵盖项目配置、命令行参数等方式定义的符号)。
获取指定编译的已定义预处理器符号
如果你已经持有一个Compilation实例(比如从项目模型、语法树的编译上下文获取),直接访问其Options.PreprocessorSymbolNames属性即可:
// 假设已有Compilation实例compilation var preprocessorSymbols = compilation.Options.PreprocessorSymbolNames; // 检查是否包含RELEASE符号 bool isReleaseMode = preprocessorSymbols.Contains("RELEASE");
注意:符号名称区分大小写,DEBUG和debug会被视为不同符号。
内容的提问来源于stack exchange,提问作者Przemaas
相关产品推荐
相关产品推荐

