CZGL.Roslyn

开源项目位置:https://github.com/whuanle/CZGL.CodeAnalysis

基于 Roslyn 技术的 C# 动态代码构建器以及编译器,开发者可以使用此库动态构建 C# 代码,并且通过指定条件编译代码。

  • 运行时动态构造代码;
  • 运行时为程序提供新的模块功能,拓展能力;
  • 设计函数平台,以代码片段为单位执行;
  • 语法分析提示,编译错误语法警告,精确到代码行;
  • 完善的代码标准,避免动态代码语法错误;
  • 简洁、简单的 API,完整的 Test 测试;
  • ... ...

动图演示

这里使用 Blazor 测试演示,代码可以在源码的 examples/BlazorExample 中找到。

Blazor 演示的是以命名空间为单位的编译,你可以通过定制后台,实现只需要代码块即可运行,连函数头都不需要。更多功能等你来挖掘!

丰富的文档与示例

CZGL.Roslyn 拥有丰富的文档说明和 API 接口说明,让你使用起来得心应手!

文档 URL:https://1586052146.gitbook.io/codeanalysis

API URL:https://czgl-roslyn.github.io/czgl-roslyn

版本更新计划

  • 0.1.0 α版(正在开发中,当前版本)

    特性:一个具有完整功能的初级版本。

  • 0.2.0 β(beta)版

    特性:消除了严重的错误和缺陷,完成大量的单元测试等,对代码的可靠性有了极大的提升;能够上线 Nuget 提供用户试用;对用户的需求进行收集,改进程序;

  • 0.3.0 γ版

该版本已经相当成熟了,根据用户使用 β 版本后的建议和需求进行更新;开始关注性能,进行性能测试已经采取措施对性能进行改进。

可以做什么

最大的特点就是动态代码构造以及动态编译,因此我们可以分为两部分讨论。

动态代码生成

  • 数据库表还原实体,自动生成类模型文件;(EFCore 有这功能)

  • 公司内部定义工具集,通过确定的模板,一键生成代码!

  • 通过已确定的逻辑功能,快速生成代码导出!

  • 编写 AOP 框架,实现动态代理;

  • 代码语法检查;

  • 生成计划代码,后台管理哪部分代码可执行;

  • 工作流程序通过代码生成一次性构建完毕,工作流程直接写到程序集中,提高性能!

  • 快速从表格等各种数据来源,生成代码;

  • 自定义 UI 生成器,通过拖拉控件生成代码;

    ... ...

动态编译

  • 自研云函数平台,用户上传代码即可直接执行;

  • 公司后台计划任务,以程序集为单位,自定义计划执行程序集;

  • 编写 AOP 框架,动态编译程序集;

  • 单文件(.cs)编译,不需要 SDK、IDE!脱离开发环境编译!

    ... ...

与 Natasha 的关系

Natsha 是一个非常优秀的动态代码框架,由大帅主导,形成了功能完整、性能强悍,并且兼容 .NET FX 4.6~.NET Core ↑ ,通过了大量性能测试以及高性能代码优化。

可以以强到不得了来形容。仓库地址:https://github.com/dotnetcore/Natasha

那为什么 还要写 CZGL.Rolysn 呢?

1,锻炼技术能力;

2,与 Natasha 不构成竞品, CZGL.Roslyn 尽可能做的轻量,开发者可以考虑业务大小,大型场景使用 Natasha;快速建设使用 CZGL.Roslyn;Natasha 学习曲线比较大,CZGL.Roslyn 学习上手比较快。

3,Natasha 功能完整,依赖比较多;CZGL.Roslyn 功能尽可能足够同时保存少量的依赖,体积小;

4,CZGL.Roslyn 适合写小工具,例如 dotnet-tool、数据库还原实体、为 ML.NET 提供快速代码生成等,适合作为小部件为你的程序提供额外的功能;Natasha 适合作为独立的一个产品去做,围绕 Natasha 构建更多功能;

论性能,Natasha 优秀;论功能完整性,Natasha 一整套大保健服务... ...

CZGL.Roslyn 相比 Natasha ,大概就只有 “轻量” 这个特点了,简直被秒杀。。。

我可以从这个框架学习到什么

框架特点是简单易用,你可以从中学习到大量的反射知识,以及 Roslyn 知识,甚至可能学习到 EMIT(后面我会使用这种技术优化性能)。

例如,如何通过取得特性中的属性值?

[Display(Name = "_Id")]
public int Id {get;set;}

一个 Type ,如何确定他是类、结构体、委托?

如果你查阅资料会发现,Type.IsClass 可以识别出类、委托;

以下代码为什么 JAVA 和 C# 执行结果不同?

public class A
{
public void Test
{
Console.WriteLine("A");
}
}
public class B:A
{
// 隐藏父类 Test 函数
public new void Test
{
Console.WriteLine("B");
}
} A a = new B();
a.Test();

目前 CZGL.Roslyn 处于初版,代码还处于非常简单的状态,逻辑也很简单,因此,如果你有意学习 C# 中的反射、动态代码技术等,想了解源代码在生成后如何通过反射获得信息、源代码会被如何编译等,CZGL.Roslyn 就是你最佳的选择。

动态代码框架发布-CZGL.Roslyn的更多相关文章

  1. Android 热补丁动态修复框架小结

    一.概述 最新github上开源了很多热补丁动态修复框架,大致有: https://github.com/dodola/HotFix https://github.com/jasonross/Nuwa ...

  2. android动画源码合集、动态主题框架、社交app源码等

    Android精选源码 仿MIUI果冻视图-BouncingJellyView   一个快速易用的动态主题框架   android动画效果集合源码   android使用Kotlin开发的Dribbb ...

  3. Android 使用动态载入框架DL进行插件化开发

    如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456    (来自时之沙的csdn博客) 概述: 随着应用的不断迭代.应用的体积不断增大,项目越来越臃肿,冗余添 ...

  4. Web服务cxf框架发布2

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317/ ...

  5. 深入浅出etcd系列Part 1 – etcd架构和代码框架

    1.绪论 etcd作为华为云PaaS的核心部件,实现了PaaS大多数组件的数据持久化.集群选举.状态同步等功能.如此重要的一个部件,我们只有深入地理解其架构设计和内部工作机制,才能更好地学习华为云Ku ...

  6. C# 使用Emit实现动态AOP框架 进阶篇之异常处理

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  7. C# 使用Emit实现动态AOP框架 进阶篇之优化

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  8. Spring Boot下的一种导出CSV文件的代码框架

    1.前言 ​ CSV,逗号分隔值(Comma-Separated Values),即为逗号分隔的文本文件.如果值中含有逗号.换行符.制表符(Tab).单引号及双引号,则需要用双引号括起来:如果值中包含 ...

  9. Spring Boot下的一种导出Excel文件的代码框架

    1.前言 ​ 在Spring Boot项目中,将数据导出成Excel格式文件是常见的功能.与Excel文件导入类似,此处也用代码框架式的方式实现Excel文件导出,使得代码具有可重用性,并保持导出数据 ...

  10. x01.CodeBuilder: 生成代码框架

    根据 Assembly 生成代码框架. 这是学习 AvalonEdit 的一个副产品.学习时,照着源代码新建文件夹,新建文件,添加方法与属性,虽然只是个框架,也要花费大量时间.为什么不让它自动生成呢? ...

随机推荐

  1. 《Javascript高级程序设计》读书笔记——函数与闭包

    函数与闭包 函数创建 创建函数有两种方式,第一种是函数声明.函数声明有一个很重要的特征就是函数声明提升(function declaration hoisting),意思是在执行代脚本前会先读取所有的 ...

  2. 什么是PWA 应用?核心技术有哪些

    在国内由于小程序的风生水起,PWA 应用在国内的状况一直都不是很好,PWA 和小程序有很多的相似性,但是 PWA 是由谷歌发起的技术,小程序是微信发起的技术,所以小程序在国内得到了大力的扶持,很快就在 ...

  3. forEach在项目中的使用

    forEach 会改变原始数组 被forEach循环的数组不能够为空 forEach会改变原始数组 value是内容 index是索引 array是你写的数组. foeEach内部是异步的哈 功能描述 ...

  4. String 中的Trim

    Trim 切除首尾指定字符 var newStr=""; char[] trimChars={'@','#','$',' '}; string strC="@Hello# ...

  5. js下载附件(文件时候),文件名一直不出现乱码

    if (lastUrl.name) { //我们后端很奇怪有时候是个对象属性,有时候是个string window.open(url + `?attname=${lastUrl.name}`); } ...

  6. 【二】最新多智能体强化学习文章如何查阅{顶会:AAAI、 ICML }

    相关文章: [一]最新多智能体强化学习方法[总结] [二]最新多智能体强化学习文章如何查阅{顶会:AAAI. ICML } [三]多智能体强化学习(MARL)近年研究概览 {Analysis of e ...

  7. 【深度学习项目二】卷积神经网络LeNet实现minst数字识别

    相关文章: [深度学习项目一]全连接神经网络实现mnist数字识别 [深度学习项目二]卷积神经网络LeNet实现minst数字识别 [深度学习项目三]ResNet50多分类任务[十二生肖分类] 『深度 ...

  8. C++ STL 标准模板库(排序/集合/适配器)算法

    C++ 标准模板库STL,是一个使用模板技术实现的通用程序库,该库由容器container,算法algorithm,迭代器iterator,容器和算法之间通过迭代器进行无缝连接,其中所包含的数据结构都 ...

  9. C++ GDAL提取多时相遥感影像中像素随时间变化的数值数组

      本文介绍基于C++语言GDAL库,批量读取大量栅格遥感影像文件,并生成各像元数值的时间序列数组的方法.   首先,我们来明确一下本文所需实现的需求.现在有一个文件夹,其中包含了很多不同格式的文件, ...

  10. Java开发学习(三十八)----SpringBoot整合junit

    先来回顾下 Spring 整合 junit @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = Spring ...