Natasha V1.3.6.0 的升级日志

开源库满足于个人,而完善于大众。

Natasha 自稳定版发布之后,众多老铁参与增强改进,感谢如下老铁的反馈:

1. 异常搜集

在 wenjq0911 建议下,添加了异常捕获,现 Natasha 的编译器已支持 Exception 字段,它将在整个编译周期中搜集异常。


  var fastBuilder = FastMethodOperator.New;
  fastBuilder.Complier.Exception;             //编译后异常会进入这里

  var fakeBuilder = FakeMethodOpeartor.New;
  fakeBuilder.Complier.Exception;

  var oopBuilder = new OopOperator();
  oopBuilder.Complier.Exception;

  if(Builder.Complier.Exception.ErrorFlag == ComplieError.None)
  {
        //编译成功!
  }
  

UT地址:https://github.com/dotnetcore/Natasha/blob/master/test/NatashaUT/ExceptionTest.cs

2. Web环境

另外 wenjq0911 提供了 web 环境的运行信息,根据排查和调研,Natasha 现采用 AspNetCore 的 refs 子文件夹方式提供 web 应用程序的引用,配置文件内容已在 ReadMe 中更改。


<PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    // 一定要加上这句话
    <PreserveCompilationContext>true</PreserveCompilationContext>
    // WEB发布加
    <MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>
</PropertyGroup>

3. 异步方法

在 Jello 的建议下,增加了异步方法的反解还原,并在 FastMethodOperator 中支持 UseAsync/AsyncFrom 等异步来源方法。


public static async void RunAsyncDelegate2()
{
    var delegateAction = FastMethodOperator.New

                        .UseAsync()

                        .Param<string>("str1")
                        .Param<string>("str2")

                        .MethodBody(@"
                            await Task.Delay(1000);
                            string result = str1 +"" ""+ str2;
                            Console.WriteLine(result);
                            return result;"

                        .Return<Task<string>>()

                        .Complie();

    string result = await ((Func<string, string, Task<string>>)delegateAction)?.Invoke("Hello", "World1!");
    Assert.Equal("Hello World1!", result);
 }
 

UT地址:https://github.com/dotnetcore/Natasha/blob/master/test/NatashaUT/AsyncMethoddTest.cs

4. 智能方法

Wayne 和 Dennis 在异步的基础上给出了体验优化的建议,Natasha 的Complier 函数目前支持方法参数及返回值的智能解析:

在不指定参数的情况下默认使用 TDelegate 的参数;

在不指定返回值的情况下,默认使用 TDelegate 的返回类型;


 var delegateAction = FastMethodOperator.New

                .UseAsync()
                .MethodBody(@"
                            string result = arg1 +"" ""+ arg2;
                            Console.WriteLine(result);
                            return result;")

                .Complie<Func<string, string, Task<string>>>();

string result =await delegateAction?.Invoke("Hello", "World2!");
 Assert.Equal("Hello World2!", result);

UT地址:https://github.com/dotnetcore/Natasha/blob/master/test/NatashaUT/AsyncMethoddTest.cs

5. 外部文件与运行时脚本混合编译

在 Teng 的建议下,增加了外部文件和运行时脚本混合编译的功能。使用 LoadFile方法将外部 Dll 文件引入运行时,并添加到编译列表中。LoadFile 方法是在IComplier 抽象编译器中实现的,所以,只要 Builder 类实现了编译器,都将拥有此方法。


using System;

namespace ClassLibrary1
{
    public class Class1
    {
        public void Show1()
        {
            Console.WriteLine("RunShow1");
        }

        public static void Show2()
        {
            Console.WriteLine("RunShow2");
        }
    }
}
string text = @"
    using System;
    using System.Text;
    using ClassLibrary1;

    namespace HelloWorld
    {
       public class Test
       {
            public override string ToString()
            {
                Class1 a = new Class1();
                a.Show1();
                Class1.Show2();
                return ""11"";
            }
       }
    }";

//Class1 来自于 ClassLibrary1.dll

OopComplier oop = new OopComplier(); //OopComplier在2.0中移除
oop.LoadFile(@"D:\Project\IlTest\ClassLibrary1\bin\Debug\netstandard2.0\ClassLibrary1.dll");
Type type = oop.GetClassType(text);

//调用
var a = Activator.CreateInstance(type);
Console.WriteLine(a.ToString());

(2.0版本引擎升级后会将此方法包装进程序集域的操作类中)

6. 继承、重写与实现

allmyfantasy 建议下,完善了类、接口、抽象类、虚方法的实现。


 ProxyOperator<Interface> builder = new ProxyOperator<Interface>();
 builder.OopName("InterfaceClass");
 builder["InterfaceMethod"] = "return 123456;";  // public method
 builder.Compile();
 var test = builder.Create("InterfaceClass");

 ProxyOperator<Class> builder = new ProxyOperator<Class>();
 builder.OopName("TestClass");
 builder["NormalMethod"] = "return 123456;";     //new method
 builder["VirtualMethod"] = "return 123456;";    //override method
 builder.Compile();
 dynamic test = Activator.CreateInstance(builder.TargetType);

 ProxyOperator<Abstract> builder = new ProxyOperator<Abstract>();
 builder.OopName("AbstractClass");
 builder["AbstractMethod"] = "return 123456;";   //overrider method
 builder.Compile();
 var test = builder.Create("AbstractClass");
 

UT地址:https://github.com/dotnetcore/Natasha/blob/master/test/NatashaUT/ProxyTest.cs

7. 添加包装类

guodf、Teng、WeihanLi 的建议下,添加包装类提升使用体验。

  var result = NewClass.Create(Action<OopOperator> action);
  var result = NewInterface.Create(Action<OopOperator> action);
  var result = NewStruct.Create(Action<OopOperator> action);

  var type = result.Type;
  var error = result.Exception; 

  var result = NewMethod.Create(Action<FastMethodOperator> action);

  var error = result.Exception;
  var method = result.Method;
  method();

8. 支持非安全方法

根据 FUTURE* 的需求,支持了非安全方法的编译,现可以使用 UseUnsafe 方法来实现。

9. 快速实现动态功能

增加了 NFunc/NAction 两种快速实现委托的操作类。
//NFunc 和 NAction 支持的方法:
// 普通方法:Delegate
// 异步方法:AsyncDelegate
// 非安全方法:UnsafeDelegate
// 非安全异步方法:UnsafeAsyncDelegate

var action = NFunc<string, string, Task<string>>.UnsafeAsyncDelegate(@"
                            string result = arg1 +"" ""+ arg2;
                            Console.WriteLine(result);
                            return result;");

string result = await action("Hello", "World1!");
//result = "Hello World1!"

10. 枚举类型构建与编译


var script = new OopOperator()
    .HiddenNameSpace().ChangeToEnum()
    .OopAccess(AccessTypes.Public).OopName("EnumUT1")
    .EnumField("Apple")
    .EnumField("Orange",2)
    .EnumField("Banana")
    .Builder().Script;

 /* result:
public enum EnumUT1{
   Apple,
   Orange=2,
   Banana}*/
   

(2.0版本将在此基础上增加封装类)

11. 日志加深一级

\netcoreapp2.2\log\2019\08月19日\17时39分

(2.0版本将进行优化和改动)

鸣谢贡献者:

感谢 WeihanLi 帮忙做了 CodeReview 的工作。
感谢 Teng 帮忙做了 WikiReview 的工作。

Natasha2.0 将兼容 Core3.0 版本,除升级优化引擎之外还将支持隔离编译与卸载功能。后续还会跟随合理需求进行升级维护, 感谢各位的支持和鼓励。
欢迎访问主页并扫码进入 Natasha 生态群:https://github.com/dotnetcore/Natasha
孵化组正在进行的项目:DeepClone/NMapper/NCaller

原文地址:https://www.cnblogs.com/NMSLanX/p/11438296.html

时间: 2024-08-05 17:15:42

Natasha V1.3.6.0 的升级日志的相关文章

Oracle11.2.0.1升级到11.2.0.3

Oracle数据库升级也并非简单的事,这篇博客,博主对Oracle那点事做了较详细的介绍: http://blog.itpub.net/9599/viewspace-473003/ 我还属于Oracle的菜鸟,就不献丑介绍了. 下面我就简单总结下,Oracle同版本升级的经历: 升级数据库: 1. 先检查数据库当前版本: SELECT * FROM v$version; 2. 使用RMAN或exp 进行全库备份 [这一步非常非常重要,因升级到数据部分时,虚拟机没空间了,导致VM崩溃,升级失败.o

ORACLE 11.2.0.1升级到11.2.0.3

ORACLE 11.2.0.1升级到11.2.0.3 最近听了李光老师的关于oracle的升级公开课,深有感悟,之前一直想自己测试的,没有下定决心,这几天自己在虚拟机上测试了一下,测试的过程如下,当然这个只是一些基本的步骤,实际的生产环境我想比这个复杂的多了,但是不用急,慢慢来,循序渐进吧... 1. 数据库情况 单实例非ASM存储 ORACLE_SID : orcl ORACLE_HOME: /u01/app/oracle/product/11.2.0/dbhome_1 1. 数据库原始状态

Redhat 5.4 Orcle RAC 数据库 从10.2.0.1升级到 10.2.0.4

之前安装的是两个节点的RAC 平台. 数据库版本是10.2.0.1. 这个实验的目的就是将这个数据库版本从10.2.0.1 升级到 10.2.0.4.  升级包可以从Oracle metalink上进行下载,这个下载需要Oracle 付费的帐号. 网络可能也有资源下载. 10.2.0.4的patch number 是:p6810189. 两个节点的RAC 安装,参考Blog: Redhat 5.4 + ASM + RAW+ Oracle 10g RAC 安装文档 http://blog.csdn

11.2.0.3升级到11.2.0.4报错ORA-01157 ORA-01110

昨天晚上生产库要做升级,从11.2.0.3升级到11.2.0.4,但是遇到了ORA-01157 ORA-01110报错,数据库无法startup upgrade. 环境:HP-UX B.11.31+11.2.0.3+祼设备,数据库大小近8T 由于之前做过一次,也有现成的文档算是轻车熟路了,11.2.0.4软件和补丁已经提前打好,停完业务之前就开始做升级. 刚开始做检查都比较顺利,一直到RMAN备份完成.由于数据库数据量太大,采用把所有业务表空间置为read only状态,只备份系统相关表空间(S

rac 10g 10.2.0.1升级到10.2.0.5具体解释

    RAC 10.2.0.1 升级到 10.2.0.5 一. 准备: Patch 包:p8202632_10205_LINUX.zip   节点数:3个节点       RAC1    RAC2   RAC3 当前节点状态 节点1: [[email protected] bin]# ./crs_stat -t Name          Type           Target    State    Host ---------------------------------------

升级日志

软件升级原则------------------------------------------------------ 沿着软件设计主线进行日常升级迭代 根据用户反馈情况,选择性采取部分具有通用性需求的功能实现 升级方法 ------------------------------------------------ http://t.cn/Rp1Zh7J 升级日志 ------------------------------------------------ 版本v1.20170917 认

rac 10g 10.2.0.1升级到10.2.0.5详解

    RAC 10.2.0.1 升级到 10.2.0.5 一. 准备: Patch 包:p8202632_10205_LINUX.zip   节点数:3个节点       RAC1    RAC2   RAC3 当前节点状态 节点1: [[email protected] bin]# ./crs_stat -t Name          Type           Target    State    Host ---------------------------------------

探索Oracle之数据库升级二 11.2.0.3升级到11.2.0.4完整步骤

探索Oracle之数据库升级二  11.2.0.3升级到11.2.0.4完整步骤 说明:         这篇文章主要是记录下单实例环境下Oracle 11.2.0.1升级到11.2.0.3的过程,当然RAC的升级是会有所不同.但是他们每个版本之间升级步骤都是差不多的,先升级Database Software,再升级Oracle Instance. Oracle 11.2.0.4的Patchset No:19852360下载需要有Oracle Support才可以.  Patchset包含有7个

Atitit jquery &#160;1.4--v1.11 &#160;v1.12 &#160;v2.0 &#160;3.0 的新特性

Atitit jquery  1.4--v1.11  v1.12  v2.0  3.0 的新特性 1.1. Jquery1.12  jQuery 2.2 和 1.12 新版本发布 - OPEN资讯.html   2016.11 1.1.1. jQuery.htmlPrefilter()1 1.2. 2016.7  jq3.0 新特性1 1.3. Jq3.1新特性 jQuery 3.1.1 发布了,该版本包括一些 BUG 修复和改进.3 1.1. Jquery1.12  jQuery 2.2 和