文章转载授权级别: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&lt;Func&lt;string, string, Task&lt;string&gt;&gt;&gt;();   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&lt;Interface&gt; builder = new ProxyOperator&lt;Interface&gt;();   builder.OopName("InterfaceClass");    builder["InterfaceMethod"] = "return 123456;";  // public method   builder.Compile();  var test = builder.Create("InterfaceClass"); ProxyOperator&lt;Class&gt; builder = new ProxyOperator&lt;Class&gt;(); builder.OopName("TestClass"); builder["NormalMethod"] = "return 123456;";     //new method   builder["VirtualMethod"] = "return 123456;";    //override method  builder.Compile();  dynamic test = Activator.CreateInstance(builder.TargetType);   ProxyOperator&lt;Abstract&gt; builder = new ProxyOperator&lt;Abstract&gt;();   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&lt;OopOperator&gt; action);    var result = NewInterface.Create(Action&lt;OopOperator&gt; action);    var result = NewStruct.Create(Action&lt;OopOperator&gt; action);   var type = result.Type;    var error = result.Exception;  var result = NewMethod.Create(Action&lt;FastMethodOperator&gt; 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&lt;string, string, Task&lt;string&gt;&gt;.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.md

OpenNCC,专注.NET技术的公众号

https://www.dotnetcore.xyz

微信ID:OpenNCC

长按左侧二维码关注

欢迎打赏组织

给予我们更多的支持

【C】Natasha V1.3.6.0 的升级日志相关推荐

  1. Natasha V1.3.6.0 的升级日志

    开源库满足于个人,而完善于大众. Natasha 自稳定版发布之后,众多老铁参与增强改进,感谢如下老铁的反馈: 1. 异常搜集 在 wenjq0911 建议下,添加了异常捕获,现 Natasha 的编 ...

  2. EFR32MG21 zigbee 3.0 OTA 升级实验

    EFR32MG21 zigbee 3.0 OTA 升级实验 参考文档:AN728 https://www.sekorm.com/doc/1607600.html 芯片:EFR32MG21A010F76 ...

  3. 爱站seo工具包 v1.11.15.0

    点击下载来源:爱站seo工具包 v1.11.15.0 爱站seo工具包是一款网站数据查询应用,一个强大的站长工具集合,主要整合了爱站原有的各种功能.爱站seo工具包破解版拥有免费的SEO查询功能,包括 ...

  4. windows 2003 下oracle从10.2.0.1升级到10.2.0.4

    方法一: 1. 完全安装10.2.0.1 2. 安装完成后,停止所有的oracle服务,可以通过停止oracle 的window services或者使用以下命令来实现. emctl stop dbc ...

  5. Oracle 10g(10.2.0.4)升级到10.2.0.5.19

    一.将数据库版本从10.2.0.4 升级到 10.2.0.5,再升级到10.2.0.5.19 (1) 备份等过程略过,一个老库的升级过程,记录之.   (2) 一致性关闭数据库及监听 sqlplus ...

  6. 从oracle10g 10.2.0.1 升级到10.2.0.4碰到的问题及解决

    这两天做数据库的升级,从10.2.0.1升级到10.2.0.4,升级安装很顺利,但安装完成后再用常用用户连接数据库,出现如下提示错误: ORA-12514:TNS:监听程序当前无法识别连接描述符中请求 ...

  7. Linux下Oracle 10.2.0.1升级到10.2.0.4总结

    最近部署测试环境时,将测试环境ORACLE数据库从10.2.0.1升级到了10.2.0.4,顺便整理记录一下升级过程. 实验环境: 操作系统:Oracle Linux Server release 5 ...

  8. 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上进 ...

  9. mongoDB3.0.2 升级操作

    mongodb 升级到3.0.2 考虑到mongoDB 3.0推出不久,上个月还不想冒然进行升级,虽然性能说得很诱人. 现看到版本已到3.0.2,是到要升级的时候了. 开始在测试环境先做一个升级,没有 ...

最新文章

  1. 论文笔记之:Let there be Color!: Joint End-to-end Learning of Global and Local Image Priors for Automatic
  2. Linux C :Linux 下第一个C程序
  3. UUID 32位生成
  4. Linux网络:Virtual Routing and Forwarding (VRF)
  5. 微服务升级_SpringCloud Alibaba工作笔记0004---认识spring gateway理解新一代网关
  6. 域名平台SSL证书及Nginx 配置SSL证书简易教程
  7. Swift入门基础知识
  8. 88.合并两个有序数组(力扣leetcode)博主可答疑该问题
  9. the7 Quick Start Guide
  10. 自动抢票之 12306 抢票篇
  11. 【防诈骗】QQ账号安全检测工具-腾讯出品
  12. 项目实践——语音计算器
  13. 虚拟语气--专升本语法
  14. unity添加背景图片
  15. “Microsoft Office Professional Plus 2010在安装中出错”解决办法
  16. misc方向题型总结
  17. 慌得一逼,Kafka宕机后不再高可用?吓死宝宝了
  18. 【云周刊】第124期:实时计算来临!阿里新一代实时计算引擎 Blink,每秒支持数十亿次计算
  19. 语音转文字最准确的方法跟最省事的方法你知道吗?
  20. 字典和集合-单词识别

热门文章

  1. Teams Bot开发系列:Teams的Activity处理
  2. 网格自适应_ANSYS 非线性自适应(NLAD)网格划分及应用举例
  3. Vim的新一代补全插件:coc.nvim
  4. prometheus python client
  5. curl   liinux下http命令执行工具
  6. jbpm6.5 环境搭建(三) 数据库 切换
  7. Centos6.5使用ELK(Elasticsearch + Logstash + Kibana) 搭建日志集中分析平台实践
  8. 使用ArcGIS Server发布我们的数据
  9. 制作一个类似苹果VFL的格式化语言来描述UIStackView
  10. 认清几种视频接口标准---无私奉献版