当前位置: 首页 > news >正文

在 Roslyn 分析语法树时添加条件编译符号的支持

我们在代码中会写 #if DEBUG 或者 [Conditional("DEBUG")] 来使用已经定义好的条件编译符号。而定义条件编译符号可以在代码中使用 #define WALTERLV 来实现,也可以通过在项目属性中设置条件编译符号(Conditional Compilation Symbols)来实现。

然而如果我们没有做任何特殊处理,那么使用 Roslyn 分析使用了条件编译符号的源码时,就会无法识别这些源码。


如果你不知道条件编译符号是什么或者不知道怎么设置,请参见:

  • .NET/C# 项目如何优雅地设置条件编译符号?

本文内容

我们在使用 Roslyn 分析语法树时,会创建语法树的一个实例。如果使用默认的构造函数,那么就不会识别设置了条件编译符号的语句,如下图:

不识别条件编译符号

而实际上构造函数的参数中带有 preprocessorSymbols 参数,即预处理符号。在传入此预处理符号的情况下,Roslyn 就可以识别此符号了:

识别的条件编译符号

方法是传入 preprocessorSymbols 参数:

var preprocessorSymbols = new[] {"DEBUG", "TRACE", "WALTERLV", "NETCOREAPP2_1"};
var syntaxTree = CSharpSyntaxTree.ParseText(originalText, new CSharpParseOptions(
    LanguageVersion.Latest, DocumentationMode.None, SourceCodeKind.Regular, preprocessorSymbols)

此后,你可以拿 syntaxTree 做其他事情了:

var compileTypeVisitor = new CompileTypeVisitor();
compileTypeVisitor.Visit(syntaxTree.GetRoot());
Types = compileTypeVisitor.Types.ToList();

当然这段代码你可能编译不通过,因为这是另一篇博客中的源码:

  • Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码

本文所用的查看语法树的插件,你可以查看另一篇博客:

  • Roslyn 入门:使用 Visual Studio 的语法可视化(Syntax Visualizer)窗格查看和了解代码的语法树

我的博客会首发于 https://walterlv.com/,而 CSDN 和博客园仅从其中摘选发布,而且一旦发布了就不再更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://blog.csdn.net/wpwalter),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 自然码的形码
  • 出于迁移项目的考虑,GitHub 中 Fork 出来的项目,如何与原项目断开 Fork 关系?
  • 只需 5 秒钟,你就能取到 WPF 程序的超高分辨率超高清截图
  • 谨慎使用 FileInfo.Exists 实例方法,而是使用 File.Exists 静态方法替代
  • UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等)
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • int? 竟然真的可以是 null!.NET/C# 确定可空值类型 NullableT 实例的真实类型
  • Slack 开发入门之 Incoming Webhooks:往 Slack 的 Channel 中发消息
  • 三值 bool? 进行与或运算后的结果
  • 为什么我们不应该使用微信或者 QQ 作为团队协作的 IM 工具?
  • 通过重写预定义的 Target 来扩展 MSBuild / Visual Studio 的编译过程
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • C# 中委托实例的命名规则
  • 在 Target 中获取项目引用的所有依赖(dll/NuGet/Project)的路径
  • 让 MSBuild Target 支持 Clean
  • JavaScript-如何实现克隆(clone)函数
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【译】理解JavaScript:new 关键字
  • 2017 前端面试准备 - 收藏集 - 掘金
  • 30天自制操作系统-2
  • in typeof instanceof ===这些运算符有什么作用
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • mockjs让前端开发独立于后端
  • PHP 小技巧
  • Quartz初级教程
  • React的组件模式
  • Ruby 2.x 源代码分析:扩展 概述
  • 安装python包到指定虚拟环境
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于字符编码你应该知道的事情
  • 开源SQL-on-Hadoop系统一览
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 字符串匹配基础上
  • 2017年360最后一道编程题
  • 容器镜像
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #Linux(Source Insight安装及工程建立)
  • (003)SlickEdit Unity的补全
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (2)(2.10) LTM telemetry
  • (ZT)出版业改革:该死的死,该生的生
  • (初研) Sentence-embedding fine-tune notebook
  • (二)pulsar安装在独立的docker中,python测试
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (五)Python 垃圾回收机制
  • (原)本想说脏话,奈何已放下
  • (转)3D模板阴影原理
  • (转载)(官方)UE4--图像编程----着色器开发
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET6实现破解Modbus poll点表配置文件