【C】Natasha V1.3.6.0 的升级日志
文章轉(zhuǎn)載授權(quán)級別:C????????????預(yù)計閱讀時間:8分鐘
開源庫滿足于個人,而完善于大眾。
Natasha 自穩(wěn)定版發(fā)布之后,眾多老鐵參與增強改進,感謝如下老鐵的反饋:
1. 異常搜集
在 wenjq0911 建議下,添加了異常捕獲,現(xiàn) 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環(huán)境
另外 wenjq0911 提供了 web 環(huán)境的運行信息,根據(jù)排查和調(diào)研,Natasha 現(xiàn)采用 AspNetCore 的 refs 子文件夾方式提供 web 應(yīng)用程序的引用,配置文件內(nèi)容已在 ReadMe 中更改。
<PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.2</TargetFramework> // 一定要加上這句話 <PreserveCompilationContext>true</PreserveCompilationContext> //?WEB發(fā)布加? <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 在異步的基礎(chǔ)上給出了體驗優(yōu)化的建議,Natasha 的Complier<TDelegate> 函數(shù)目前支持方法參數(shù)及返回值的智能解析:
在不指定參數(shù)的情況下默認使用 TDelegate 的參數(shù);
在不指定返回值的情況下,默認使用 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 抽象編譯器中實現(xiàn)的,所以,只要 Builder 類實現(xiàn)了編譯器,都將擁有此方法。
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); //調(diào)用 var a = Activator.CreateInstance(type); Console.WriteLine(a.ToString());(2.0版本引擎升級后會將此方法包裝進程序集域的操作類中)
6. 繼承、重寫與實現(xiàn)
allmyfantasy 建議下,完善了類、接口、抽象類、虛方法的實現(xiàn)。??
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. 支持非安全方法
根據(jù) FUTURE* 的需求,支持了非安全方法的編譯,現(xiàn)可以使用 UseUnsafe 方法來實現(xiàn)。
9. 快速實現(xiàn)動態(tài)功能
增加了 NFunc/NAction 兩種快速實現(xiàn)委托的操作類。
//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. 枚舉類型構(gòu)建與編譯
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版本將在此基礎(chǔ)上增加封裝類)
11. 日志加深一級
\netcoreapp2.2\log\2019\08月19日\17時39分
(2.0版本將進行優(yōu)化和改動)
鳴謝貢獻者:
感謝 WeihanLi 幫忙做了 CodeReview 的工作。
感謝 Teng 幫忙做了 WikiReview 的工作。
Natasha2.0 將兼容 Core3.0 版本,除升級優(yōu)化引擎之外還將支持隔離編譯與卸載功能。后續(xù)還會跟隨合理需求進行升級維護, 感謝各位的支持和鼓勵。
歡迎訪問主頁并掃碼進入 Natasha 生態(tài)群:https://github.com/dotnetcore/Natasha
孵化組正在進行的項目:DeepClone/NMapper/NCaller
https://github.com/dotnetcore
打賞一杯酒,削減三分愁。跟著我們走,脫發(fā)包你有。
組織打賞賬戶為檸檬的賬戶,請標注「NCC」,并留下您的名字,以下地址可查看收支明細:https://github.com/dotnetcore/Home/blob/master/Statement-of-Income-and-Expense.md
OpenNCC,專注.NET技術(shù)的公眾號
https://www.dotnetcore.xyz
微信ID:OpenNCC
長按左側(cè)二維碼關(guān)注
歡迎打賞組織
給予我們更多的支持
總結(jié)
以上是生活随笔為你收集整理的【C】Natasha V1.3.6.0 的升级日志的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于SQLite+EF6实现一套自己的K
- 下一篇: .NET 程序员如何学习Vue