简介

Natasha 是一个基于 Roslyn 的动态编译类库,它以极简的 API 完成了动态编译的大部分功能,使用它可以在程序运行时编译出新的程序集。

Natasha 允许开发人员直接使用 C# 代码即可编写运行时的功能,避免了 Emit 的学习、开发、维护的成本。

Natasha 的编译单元的基本输出是程序集,程序集加载在域中,使用该类库可以创建域,并在不同的域内创建新的功能,也支持可以卸载域。

Natasha 为开发人员提供了插件管理的功能,并内置解析依赖的功能,我们可以有针对性的加载和卸载插件及其依赖。

使用 Natasha 我们可以快速的实现映射/类库粘合/业务逻辑组装/动态代理/协议转换等等,使用 Natasha  需要一定的编程基础,有动态编译经验相关的实践。尽管 Natasha  可以输出详细日志,但是动态功能的开发本应该是逻辑畅通,代码规范的,如果你不能保证代码是畅通的,且没有动态编译的思维可以先找相关的文章进行学习。

项目链接地址: https://github.com/dotnetcore/Natasha

Natasha 的进化

Natasha 自 v3.0.0 版本之后,进行了比较大的革新,以下我列举一些比较重要的:

  • 移除对 .NET Standard2.0 / .NET Core 2.1-3.0 的支持,目前支持的版本为:.NET Core 3.1/.NET 5.0/.NET 6.0,兼容版本已归档至其他分支。Runtime 是 Natasha 的强依赖, .NET 从 3.0 起,Runtime 升级了很多新的特性, 比如支持可空引用及元数据处理,支持 ALC 高级特性,方便的插件依赖解析方案等等,另外由于个人精力有限,最终决定从分水岭 3.1  开始做兼容。

  • 语义过滤,自 v3.0.0 以后,Natasha 新增了语义层,这让 Natasha 显得更加智能,我们可以根据自己的需求去解析和重组语法语义。比如 Natasha 内置的语义处理,其中有一个功能是将无用的 using 移除掉,只保留有用的 using。大大减少了日志输出的代码,让开发者一眼看到有用的代码逻辑。编译一段代码,需要引用元数据,需要准备 using,需要写正确的代码,最后是输出方式,为了让开发者以最快速度上手,Natasha  解决了元数据引用问题,以及 using 覆盖问题,另对外提供了输出 API,理论上开发者需要关注的是自己如何编写一段动态代码, 如何与运行时其他功能接洽配合。

    另针对命名空间滥用导致的多义性引用问题,我们提供了语义扩展包 Natasha.CSharp.Extension.Ambiguity

  • 性能优化,优化是 Natasha 一直在做的事情,Natasha 在预热方法上进行了一些并发的改造,以便让相互无关的任务并行初始化,除此之外也移除了 AdWorkspace 代码,这些代码均由高性能的方案取代。针对性能敏感场景, 我们增加了预热时全局修剪错误语义,以及禁用语义过滤的 API,以便让编译更快的发生。

  • 新特性支持。支持 C# 最高语言版本,支持可空引用的编译(默认关闭),DLL/PDB/XML 文件手动选择生成。Natasha  4.0 的源码使用了可空引用支持,因此支持可空引用项目的接入和使用,在方法调用的上下游明确了可空界限。但在动态编译层面,尝试可空引用的元数据解析功能时,我遇到了无法解决的难题,可空引用的顶层泛型传递是无法正确解析的,因此在  Action<string?> 等元数据解析中,无法得到正确结果,另外方法返回值可空引用解析也未找到方法,综上 Natasha  默认关闭了动态编译初始化中的可空引用的选项,开发者需要自行开启。

  • 重构引用管理,4.0 重构了 Natasha 的引用管理,经过探索我们最终选定以 AssemblyName 作为引用版本管理的依据,并在预热过程中采用只读上下文解析引用。

  • 重构插件管理,4.0 重构了 Natasha.Domain 域实现,摘除了对引用管理的耦合,让 NatashaDomain 更专注于程序集及其依赖的加载与卸载,此次对外提供了4个方法以便于用户在加载插件时管理不同版本的依赖。

  • 重构日志模块,4.0 版本后日志将由用户自行控制写入和获取,对外提供编译后的日志处理事件,Natasha 将不再负责日志的 IO 部分。

  • 重构异常模块,4.0 重构了 Natasha 的编译单元,其中语法转换阶段如果出错会抛出异常,之后编译不成功也会抛出异常,并提供编译成功和失败事件。

实战应用

Natasha 已经在网友公司及我司得到了广泛应用,比如:客户端脚本定制,动态计分系统,低代码应用中的逻辑组装与编译, 类库中字符串到表达式树的转换,基于算法的高性能只读并发字典,忽略类库版本的代码粘合剂,实体映射,动态路由,动态 RPC, 动态定时任务等等。

Natasha 与其他技术

  • SG(Source Generetor)

首先来讲 Natasha 与 SG 有重叠的部分,但也有各自取代不了的地方。我认为比较好的组合是,SG 提供静态约束,Natasha 来提供动态实现。

  • AOT

Natasha 是尽可能覆盖全面的程序集和引用,剪裁需谨慎,另外 AOT 不会取代动态编译,只会平行发展。

未来规划

Natasha 完成了自己的核心任务,但它还有很长一段的路要走,期待大家的反馈。

后续 Natasha 还有一些方案需要调研,一些应用需要开发,例如:域的强制卸载方案,基于 ASP.NET 的动态开发框架,高度灵活的高性能实体映射库等。

下一篇将介绍 Natasha 的域组件与插件编程。

Natasha 4.0 探索之路系列(一) 概况相关推荐

  1. Natasha 4.0 探索之路系列(三) 基本的动态编译

    相关文章 Natasha 4.0 探索之路系列(一) 概况 Natasha 4.0 探索之路系列(二) 「域」与插件 Natasha 的设计 动态编译 Roslyn 为开发者提供了动态编译的接口,允许 ...

  2. Natasha 4.0 探索之路系列(四) 模板 API

    相关文章 Natasha 4.0 探索之路系列(一) 概况 Natasha 4.0 探索之路系列(二) 「域」与插件 Natasha 模板 Natasha 在编译单元的基础上进行了封装整理, 并提供了 ...

  3. Natasha 4.0 探索之路系列(二) 「域」与插件

    域与ALC 在 Natasha 发布之后有不少小伙伴跑过来问域相关的问题,能不能兼容 AppDomain.如何使用 AppDomain.为什么 CoreAPI 阉割了 AppDomain 等一系列的问 ...

  4. 【Java 虚拟机探索之路系列】:JIT编译器

    [Java 虚拟机探索之路系列]:JIT编译器 作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https: ...

  5. C# 3.0入门系列

    目录导航 1 C# 3.0 入门系列(一) 从linq开始引C# 3.0. 2 C# 3.0入门系列(二) 数据库的准备,引入Linq To Sql的准备. 3 C# 3.0入门系列(三) 第一个Li ...

  6. C#3.0入门系列(五)-之Where操作

    从本节开始,本文正式更名为C#3.0入门系列.先发布一则消息,VS2007 Beta版本已经发布咯,下载地址: http://www.microsoft.com/downloads/details.a ...

  7. ASP.net 2.0 Migrating系列 - Master Pages 感触

    ASP.net 2.0 Migrating系列 - Master Pages范维肖 在Visual Web Developer 2005里的新建里多了一个Master Pages,在微软的VWD200 ...

  8. ASP.NET MVC 3.0学习系列文章—Model in ASP.NET MVC 3.0

    系列文章 ASP.NET MVC 3.0学习系列文章-序 ASP.NET MVC 3.0学习系列文章--Razor and ASP.NET MVC 3.0 ASP.NET MVC 3.0学习系列文章- ...

  9. ExtJs2.0学习系列--Ext.Panel

    ExtJs2.0学习系列--Ext.Panel 2008-06-29 12:59 上一篇文章ExtJs2.0学习系列(1)--Ext.MessageBox ,受到了大家的褒贬不一,还是有的朋友提出好的 ...

最新文章

  1. cannot resolve symbol r_64位ret2_dl_runtime_resolve模版题以及踩坑记录
  2. nssl1167-桐人的约会【最短路】
  3. 查找表的原理与结构 什么是竞争与冒险现象?怎样判断?如何消除?
  4. 超声波测距仪编程_超声波测距仪参考(含原理图程序)
  5. 7 SDImageCache
  6. ★LeetCode(429)——N叉树的层序遍历(JavaScript)
  7. 惠新宸:我也曾经是“不适合”编程的人
  8. Java 学习之集合类(Collections)
  9. 图解大数据 | Spark GraphFrames-基于图的数据分析挖掘
  10. 电商巨头角逐付费会员制,新零售生态或成为决胜关键?
  11. 使用css3制作一个简易的环形进度条
  12. Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习
  13. 科林明伦杯 哈尔滨理工大学第十届程序设计竞赛 (补)
  14. cat3 utp是不是网线_五类, 超五类,六类线,的网线,怎么区分
  15. python 类初学之 小猫
  16. Blackarch安装教程(非常详细)
  17. python代码加密解密_Python加密解密代码
  18. 小程序开发合同_小程序开发公司在哪里找?
  19. 计算机专业qs国内大学,qs计算机专业大学排名
  20. ImportError: cannot import name ‘PY3‘ from ‘_six‘

热门文章

  1. CSS3中弹性盒布局的最新版
  2. spring之二——使用maven创建一个java project
  3. [转]android 获取手机GSM/CDMA信号信息
  4. 基于ip tunnel连接不同三个不同网络的×××
  5. linux进程通讯-纯文本文件
  6. python和C语言分别实现插入排序
  7. 很好用的ISO制作软件
  8. 使用生成器创建新的迭代模式
  9. 如何保护你的linux操作系统
  10. Linux内核笔记--内存管理之用户态进程内存分配