.NET Compiler Platform,一个.NET编译平台

如何利用C# Roslyn编译器写一个简单的代码提示/错误检查?

 

OK, 废话不多说,这些天在写C#代码时突然对于IDE提示有了一些想法,之前也有了解过,不过并没有深入。

先看个截图:

一段再简单不过的代码了,大家注意看到 count 字段下面的绿色波浪线了吗,我们通常为理解一个 warning ,鼠标移上去:

提示“声明了该字段但没有使用过” 当然,这对项目代码编译没有什么影响。不过,我想了一下,如果我们可以重写IDE的编译器,把我们的一些规则写进去,对于团队

的代码review其实是很高效的一件事情。我们通常的代码review会有滞后,都是通过提交PR或代码评审,如果我们把这个检查在开发人员写代码的时候第一时间提示出来或给error提示,实现所见即所得,应该是一件很值得做的事情吧。

言归正传,我们要实现这一目的,“Roslyn” 就出场了,可以理解为 .NET Compiler Platform,一个.NET编译平台。以前我们看“Roslyn” 是这样的:

源码 -> 编译-> 程序集, 然而这里的编译其实是不透明的,也称“黑盒状态”。但微软开源之后,我们了解里面其实有这些细节:

API包括Syntax、Symbol等 ,今天不细讲这些内容,后面再写分析器的时候我会给大家罗列出来用法。

下面我们看如何准备环境(安装Roslyn):

1. 安装VS要勾选.NET Compiler Platform

2.VS2019 16.3以上版本 .NET Framework4.8 (老版本的vs似乎也可以 我没有尝试过)

3. 打开VS,新建项目-》 选择Analyzer with Code Fix 模板,如下图:

4. 项目创建后,可以看到右边Solution窗口有三个项目:

正常情况下默认启动项目为 Analyzer1.Vsix (VS扩展插件 不了解的同学可以去学习一下vs自定义插件)

5. 我们直接暴力一点,F5运行调试,项目运行后,会重新启动一个新的VS实例:

细心的同学可以看到,此时我的窗口是启动了俩个VS, 一个可以理解为“母体”,一个则是母体Copy出来的一份(这样形容应该好理解)

6. 在创建出来的VS实例窗口,我们还是按照之前的做法,新建一个控制台应用程序:

可以看到实例VS创建出来的控制台应用程序,类名 Program有提示,意思是不能小写,然后旁边有个黄色的灯泡,大概可以猜出来点击黄色灯泡可以解决

当前提示的问题,应该就是转换为大写。那么,这个简单的检查代码是如何写出来的呢?

7. 调试“母体”,在母体VS 类名为Analyzer1Analyzer 的静态方法AnalyzeSymbol打断点:

打完断点后,我在实例的VS窗口删除了类Program 的最后一个字母m,母体断点被触发,这段代码可以看到就是一个简单的检查判断,最后创建一个Rule

报给给前端的编辑器。基本上后续重写编译平台都是使用Diagnostic.Create方法,不同的则是你要写特定的逻辑来检查你团队的代码。

当然,这里分为俩个部分,一个是诊断(IDE提示,如绿色波浪线),一个是解决(黄色小灯泡里实现解决代码)

今天大概就是这样一个简单的Demo,其实里面挺复杂,后续会给大家主角讲一下AnalyzeSymbol类里的一些模型以及主要API.

PS:Roslyn源码已经在github上公开,感兴趣的可以看看源码,地址:https://github.com/dotnet/roslyn 里面代码还是很有价值的。

另外,提供一个Roslyn学习地址:https://github.com/ironcev/awesome-roslyn

.NET Compiler Platform,一个.NET编译平台的更多相关文章

  1. sublime搭建Java编译平台及编码问题

    Sublime自带Java编译功能,当时只能编译不能运行,我们做一下小小的修改就可以让sublime一步完成编译运行的功能,实现sublime搭建Java编译平台. 使用Ctrl + B 编译时,所编 ...

  2. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  3. 微信公众平台开发 - 动手篇。使用weinxinFundation开始一个微信公众平台的开发

    本文主要讲解如何使用 weinxinFundation 进行二次开发. 步骤如下: 1.创建新的web项目. 在eclipse里新建一个dynamicly web project,比如本文叫weixi ...

  4. 如何基于Go搭建一个大数据平台

    如何基于Go搭建一个大数据平台 - Go中国 - CSDN博客 https://blog.csdn.net/ra681t58cjxsgckj31/article/details/78333775 01 ...

  5. 64位 Windows 用了 32位编译平台 编译不过 MySQL API

    发生在一周前的事情了,当时想感受下 MySQL C API ,就写了几个小例子.虽然是在 Windows(我的工作电脑是 64位 Windows) 上面,但是不想用 VS ,只想用文本软件写好代码后用 ...

  6. 从头开始搭建一个dubbo+zookeeper平台

    本篇主要是来分享从头开始搭建一个dubbo+zookeeper平台的过程,其中会简要介绍下dubbo服务的作用. 首先,看下一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越多之后 ...

  7. 一个基于.NET平台的自动化/压力测试系统设计简述

    AutoTest系统设计概述 AutoTest是一个基于.NET平台实现的自动化/压力测试的系统,可独立运行于windows平台下,支持分布式部署,不需要其他配置或编译器的支持.(本质是一个基于协议的 ...

  8. Roslyn 编译平台概述

    在Language Feature Status上面看到,其实更新的并不是特别多,为了不会误导看了C# 6.0 功能预览 (一)的园友,现在把官方的更新列表拿了过来,供大家参考 C# 6.0 功能预览 ...

  9. 搭建一个dubbo+zookeeper平台

    本篇主要是来分享从头开始搭建一个dubbo+zookeeper平台的过程,其中会简要介绍下dubbo服务的作用. 首先,看下一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越多之后 ...

随机推荐

  1. python-Web-django-ajax分页

    views: from django.shortcuts import HttpResponse,redirect,render from app01.models import * import j ...

  2. Spring MVC 异步请求 Callable

    对于有的请求业务处理流程可能比较耗时,比如长查询,远程调用等,主线程会被一直占用,而tomcat线程池线程有限,处理量就会下降 servlet3.0以后提供了对异步处理的支持,springmvc封装了 ...

  3. "在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配" 问题总结

    最近C#连接ODBC数据源时,总是提示"[Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配",百度查询之后才知道原来是 ...

  4. C++深拷贝和浅拷贝细节理解

    前提 在对象拷贝过程中,如果没有自定义拷贝构造函数,编译器会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型的成员变量则调用其相应的拷贝构造函数. 资料注解 ...

  5. hadoop3.1.2启动和停止

    1/  启动 启动zookeeper: 三个节点上都zkServer.sh start 启动hdfs和yarn: 101上start-dfs.sh  102上start-yarn.sh 启动hive: ...

  6. HDU 4253-Two Famous Companies(二分+最小生成树)

    Description In China, there are two companies offering the Internet service for the people from all ...

  7. AppCan调试问题

    来源:http://edu.appcan.cn/theVideoMain1.html?chapterId=248_1 第1步, 生成AppCan调试中心 第2步, 启动AppCan调试中心 第3步, ...

  8. SpringBoot上传文件,经过spingCloud-Zuul,中文文件名乱码解决办法

    最近用springCloud整合springboot做分布式服务发现经过zuul之后上传的中文文件名乱码全都变成?????,从而引发异常,单独用springboot却是好的,在网上找到相关资料总结如下 ...

  9. Linux(16):Shell编程(3)

    vim 编程环境配置: .vimrc 文件配置如下:(.vimrc文件放到家目录下:/root :然后退出 xshell 再登陆进来xshell) set nocompatible set histo ...

  10. ASCII、Unicode、UTF-8、UTF-16、GBK、GB2312、ANSI等编码方式简析

    ASCII.Unicode.UTF-8.UTF-16.GBK.GB2312.ANSI等编码方式简析 序言 从各种字节编码方法中,能看到那个计算机发展的洪荒时期的影子. ASCII ASCII码有标准A ...