其他分享
首页 > 其他分享> > Natasha V1.3.6.0 的升级日志

Natasha V1.3.6.0 的升级日志

作者:互联网

这里:https://mp.weixin.qq.com/s?__biz=MzIyOTMwOTYyNA==&mid=2247483731&idx=1&sn=1bc7e7b4caaecdca761c2d00185a62ae&chksm=e845ec84df3265920b9e45e8030dbc0b3d53083e236645f74aafce6a36100e1a8f3bd8139d99&token=1999008487&lang=zh_CN#rd

 

文章转载授权级别:C            预计阅读时间:8分钟

 

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

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 的参数;

在不指定返回值的情况下,默认使用 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://github.com/dotnetcore

打赏一杯酒,削减三分愁。
跟着我们走,脱发包你有。

组织打赏账户为柠檬的账户,请标注「NCC」,并留下您的名字,以下地址可查看收支明细:https://github.com/dotnetcore/Home/blob/master/Statement-of-Income-and-Expense.mdOpenNCC,专注.NET技术的公众号https://www.dotnetcore.xyz微信ID:OpenNCC长按左侧二维码关注

 

欢迎打赏组织

给予我们更多的支持

标签:string,builder,V1.3,result,https,6.0,var,Natasha
来源: https://www.cnblogs.com/NMSLanX/p/11438226.html