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 的升级日志相关推荐
- 【C】Natasha V1.3.6.0 的升级日志
文章转载授权级别:C 预计阅读时间:8分钟 开源库满足于个人,而完善于大众. Natasha 自稳定版发布之后,众多老铁参与增强改进,感谢如下老铁的反馈: 1. 异常搜集 在 w ...
- 讯飞输入法android版升级日志,讯飞输入法Android版7.0 实力解锁三大输入难题
现代人的手机不是通讯工具而是一个伴侣,原本为了帮助我们更好的享受生活.提高效率,但现实情况手机却让我们变得低头不语.讯飞输入法一直致力于解放人们的双手和双眼,通过拼音输入到语音输入的小小改变,帮我们抬 ...
- 爱站seo工具包 v1.11.15.0
点击下载来源:爱站seo工具包 v1.11.15.0 爱站seo工具包是一款网站数据查询应用,一个强大的站长工具集合,主要整合了爱站原有的各种功能.爱站seo工具包破解版拥有免费的SEO查询功能,包括 ...
- 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上进 ...
- mongoDB3.0.2 升级操作
mongodb 升级到3.0.2 考虑到mongoDB 3.0推出不久,上个月还不想冒然进行升级,虽然性能说得很诱人. 现看到版本已到3.0.2,是到要升级的时候了. 开始在测试环境先做一个升级,没有 ...
- 64位Windows2003 Enterprise sp2 上64位Oracle10.2.0.1升级到Oracle10.2.0.3具体步骤
64位Windows2003 Enterprise sp2 上64位Oracle10.2.0.1升级到Oracle10.2.0.3具体步骤 错误描述:64位的Oracle10.2.0.1版本在64位W ...
- oracle从9.2.0.1升级到9.2.0.8步骤
背景:在windows 2003 server上安装了Oracle 9.2.0.1.0,现打算将其升级到9.2.0.8版本,并打上最新的安全补丁April 2008版. 1.升级oracle(admi ...
- EFR32MG21 zigbee 3.0 OTA 升级实验
EFR32MG21 zigbee 3.0 OTA 升级实验 参考文档:AN728 https://www.sekorm.com/doc/1607600.html 芯片:EFR32MG21A010F76 ...
- oracle数据库9.2,Oracle数据库从 9.2.0.1 到 9.2.0.8升级步骤 for win
1 打开远程桌面,登录到远程服务器的桌面 2 打补丁之前最重要的是数据库的备份,备份之前必须将数据库先干净的关闭,在服务管理中停掉所有的oracle相关服务. conn / as sysdba 如果报 ...
最新文章
- Spring Boot 和Apache Kafka的集成
- oracle 安装程序异常终止,Oracle安装错误“程序异常终止
- vue怎么使用eval_Webpack 构建工具手把手教你怎么用
- Appium adb 获取真实 appActivity
- 测试用例的书写方式及测试模板大全
- boost::mpl模块as_sequence的测试程序
- mysql主机咋填_mysql数据库主机填什么
- 取木棒21根c语言,关于m根火柴 ,人机最多取n根火柴(21根火柴进阶)
- Java ProcessBuilder environment()方法与示例
- map std 浮点数索引_C std :: map持有任何类型的值
- sql 在存储过程中使用事务(转)
- RabbitMQ消息接收的确认方式
- powerbi python词云图_Power BI 标签云可视化
- 【C语言】c语言基础知识梳理(超全)
- 特征向量的归一化方法
- 【英语小作文】-相关
- 炒股精髓:多位高手多年心血结晶(推荐)
- word2013表格文字上下居中
- 基于JAVASE的彩票摇号系统
- windows下更改应用程序属性的详细信息
热门文章
- SAP CRM BSP repository 如何判断switch的状态
- SAP CRM WebClient UI WebUI Runtime repository design
- 如何找到SAP ABAP odata服务实现的具体backend 系统
- 关于面向对象设计中类的方法是否应该使用boolean类型的参数
- Chrome开发者工具关于网络请求的一个隐藏技能 1
- oracle9i 查询scn,Oracle10g的current_scn是如何计算的?
- 平均正确率aps apm apl_如何通过信号词来提高雅思听力正确率?| 附写作批改
- mac securecrt程序无响应_终端仿真软件SecureCRT和Xshell,让运维工作更轻松
- linux c账户安全性,linux c flash安全策略
- datetime对应的java类型_MySQL数据类型笔记