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

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

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

  1. Centos7下Zabbix3.4至Zabbix4.0的升级步骤

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 Centos7下Zabbix3.4至Zabbix4.0的升级步骤 查看现在centos版本和zab ...

  2. 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  ...

  3. Web图片编辑控件升级日志-Xproer.ImageEditor

    版权所有 2009-2014 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com 产品首页:http://www.ncmem.com/webplug/image-e ...

  4. Oracle11.2.0.1升级到11.2.0.3

    Oracle数据库升级也并非简单的事,这篇博客,博主对Oracle那点事做了较详细的介绍: http://blog.itpub.net/9599/viewspace-473003/ 我还属于Oracl ...

  5. springboot2.0整合logback日志(详细)

    <div class="post"> <h1 class="postTitle"> springboot2.0整合logback日志(详 ...

  6. RocketMQ Release Note(RocketMQ升级日志译文)

    RocketMQ升级日志 1 4.2.0 原版Release Note 1.1 New Feature 支持传输层安全性 客户端支持log4j2 PushConsumer支持条数与大小维度的流控 1. ...

  7. POLARDB 2.0 重磅升级,分别支持Oracle与PostgreSQL

    点击订阅新品发布会! 新产品.新版本.新技术.新功能.价格调整,评论在下方,下期更新!关注更多内容,了解更多 最新发布 POLARDB 2.0 重磅升级 2019年6月19日15时,阿里云 POLAR ...

  8. Docker 1.13.0 详细更新日志

    本文讲的是Docker 1.13.0 详细更新日志[编者的话]Docker发布1.13.0版本,此次版本更新内容较多,以下为该版本具体的变更. 构建 添加在构建时可以指定镜像用作高速缓存源的功能. 这 ...

  9. 安装zabbix3.0以及升级到5.0过程

    关闭防火墙: systemctl stop firewalld.service systemctl disable firewalld.service 需要关闭 selinux,一定要关闭这个,开启s ...

随机推荐

  1. Centos7 安装 zabbix 4.0

    参考文档: https://www.zabbix.com/download?zabbix=4.0&os_distribution=centos&os_version=7&db= ...

  2. Python环境安装与基础语法(3)——进制、运算符和优先级、原码、补码

    进制 转十进制:基本运算方法(权算方式) 0b1111——>1*2**3 + 1*2**2 + 1*2**1 + 1*2**0 0x7F——>7*16**1 + F*16**0 转二进制: ...

  3. POJ 1321 棋盘问题 题解

    棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 70224 Accepted: 33254 Description 在一 ...

  4. Everybody Dance Now

    一.摘要 作者提出了一种简单的动作迁移方法,实现了"do as I do":给定一个人跳舞的源视频,作者可以在目标对象表演标准动作的短短几分钟后,将该表演转移到一个新的(业余的)目 ...

  5. 2.3 Scala面向对象编程基础

    一.类 1.类的定义 Unit表示什么都不返回 方法体最后一句的值,就是方法的返回值. 2.类成员的可见性 3.方法的定义方式 定义方法的时候加圆括号,调用时可以加圆括号c.getValue()也可以 ...

  6. Windows下使用mingw+cmake编译C/C++程序

    按照正常流程安装好mingw和cmake后,仍然是无法直接使用cmake编译处MakeFile文件的,我们需要在CMakeLists.txt中做一些配置. 首先,在PROJECT之前,设置: SET( ...

  7. 201871010105-曹玉中《面向对象程序设计(java)》第十五周学习总结

    201871010105-曹玉中<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个过程 https://www.cnblogs.com/nwnu-daizh/ ...

  8. 201871010118-唐敬博《面向对象程序设计(JAVA)》第十四周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 <<https://home.cnblogs.com/u/nwnu-daizh/>> 这个作业的要求在哪里 < ...

  9. 【NodeJS】Vue-d2Admin

    INFO Starting development server... 10% building 2/2 modules 0 active ERROR Error: Watching remote f ...

  10. JavaEE开发环境配置

    JavaEE开发环境配置 Tomcat的下载和安装 1.登录Tomcat 站点,下载Tomcat最新版本http://tomcat.apache.org/Windows平台下载ZIP包,LInux平台 ...