.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 连接SQL SERVER 并读取其数据

    1.没什么难的操作 安装  pip install pymssql import pymssql #引入pymssql模块 import pandas as pd def conn(): connec ...

  2. C++学习笔记-const

    const在C++中有着大量的运用,深刻理解const有助于进一步理解C++. const基础知识 int main() { const int a;//C++中必须初始化 int const b;/ ...

  3. 小米手机Toast带app名称

    如果用小米手机做测试,会发现,Toast弹窗有可能会在前面带app名称.这是因为你传入的context是activity,如果是Application的话,就不会显示app名称.但是,我做测试时,一般 ...

  4. Java十大bug之——包冲突

    找bug就像破案,有的bug简单,有的bug复杂,还有的bug隐藏的令人难以发现. 一个逻辑上看起来一切都正常,结果确有问题,且怎么分析都感觉自己写的没问题的情况——包冲突 遇到这个bug最开始没有任 ...

  5. "alert(1) to win" writeup

    地址:http://escape.alf.nu/ level 0: 注意补全,");alert(1)// level 1: 通过添加反斜线使用来转义的反斜线变为字符,\");ale ...

  6. java8 stream多字段排序

    注:转载请注明出处!!!!!!! 很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理 使用java8新特性,下面先来点基础的 List<类> ...

  7. 制作U盘的win7系统安装

    方法一 用iso.需要下载个UltraISO软件安装. 制作64位WIN7系统U盘安装盘方法 首页就有iso下载,有雨林木风等,我下载了系统之家最新的1907 U盘安装win7系统BIOS设置 thi ...

  8. Oracle数据块

    最小单位的输入\输出 数据块由操作系统中的一个或多个块组成 数据库是表空间的基本单位 DB_BLOCK_SIZE 查看 Oracle 块的大小语句: SQL> show parameter db ...

  9. 解决PowerDesigner提示This data item is already used in a primary identifier

    解决PowerDesigner提示This data item is already used in a primary identifier 解决PowerDesigner提示This data i ...

  10. 2019中山纪念中学夏令营-Day12[JZOJ]

    Begin (题目的排序方式:题号) 每期新姿势:(今天推荐一位巨佬)Cefola-Kiroxs 推荐知识:namespace的用法(本赛我的代码中将用到) 2019.08.12[NOIP普及组]模拟 ...