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.dllOopComplier 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 methodbuilder.Compile();var test = builder.Create("InterfaceClass");ProxyOperator<Class> builder = new ProxyOperator<Class>();builder.OopName("TestClass");builder["NormalMethod"] = "return 123456;"; //new methodbuilder["VirtualMethod"] = "return 123456;"; //override methodbuilder.Compile();dynamic test = Activator.CreateInstance(builder.TargetType);ProxyOperator<Abstract> builder = new ProxyOperator<Abstract>();builder.OopName("AbstractClass");builder["AbstractMethod"] = "return 123456;"; //overrider methodbuilder.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 // 非安全異步方法:UnsafeAsyncDelegatevar 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
總結
以上是生活随笔為你收集整理的Natasha V1.3.6.0 的升级日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Maximum Xor Secondar
- 下一篇: 老陈学 C++ 序列之二: 友元函数