【C】Natasha V1.3.6.0 的升级日志

文章转载授权级别: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/dotnetcore640?wx_fmt=gif

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

640?wx_fmt=png

640?wx_fmt=png

组织打赏账户为柠檬的账户,请标注「NCC」,并留下您的名字,以下地址可查看收支明细:https://github.com/dotnetcore/Home/blob/master/Statement-of-Income-and-Expense.md640?wx_fmt=png640?wx_fmt=png

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

https://www.dotnetcore.xyz

640?wx_fmt=png

640?wx_fmt=png微信ID:OpenNCC

640?wx_fmt=png长按左侧二维码关注

欢迎打赏组织

给予我们更多的支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET 程序员如何学习Vue

之所以取这个标题&#xff0c;是因为本文来自内部培训的整理&#xff0c;培训的对象是公司的 .NET 程序员&#xff0c;.NET 程序员学习 Vue 是为了在项目中做二次开发时能够更好地跟产品对接。Vue 是现在比较流行的前端框架&#xff0c;也是非常容易入门的前端框架&#xff0c;…

.Net之微信小程序获取用户UnionID

前言&#xff1a;在实际项目开发中我们经常会遇到账号统一的问题&#xff0c;如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一&#xff08;便于用户信息的管理&#xff09;。这段时间就有一个这样的需求&#xff0c;之前有个客户做了一个微信小程序商城&…

自由源自于自律 及其他三则分享

Office 365 官方公众号的新创深度内容推荐竹板这么一打呀&#xff0c;别的咱不夸&#xff0c;单说我们的Office 365官方公众号&#xff08;“微软Office365”&#xff09;&#xff0c;近一段时间来在内容创作上面有一些新的突破——推出了一个关于探讨大脑及思维运作的专题。请…

2019-03-11-算法-进化(求众数)

题目描述 给定一个大小为 n 的数组&#xff0c;找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在众数。 示例 1: 输入: [3,2,3] 输出: 3示例 2: 输入: [2,2,1,1,1,2,2] 输出: 2思路&#xff1a…

淘宝商品数据库设计的一些经验

前言这几个月都在做一个通过淘宝API线下管理淘宝店的系统&#xff0c;学习了很多东西&#xff0c;这里想对淘宝商品表设计用自己的想法表现出来&#xff0c;如果你觉得很扯淡&#xff0c;可以写下自己的看法.OK&#xff0c;切入正题.淘宝的商品这块的复杂程度&#xff0c;是我见…

2019-03-11-算法-进化(搜索二维矩阵II)

题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列每列的元素从上到下升序排列 示例: 现有矩阵 matrix 如下&#xff1a; [[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9…

A and B and Lecture Rooms

A and B and Lecture Rooms 题意要求我们找有多少个点iii满足dis(i,x),dis(i,y)dis(i, x), dis(i, y)dis(i,x),dis(i,y)&#xff0c;输出点iii的数量即可。 首先特判无解的情况就是dis(x,y)dis(x, y)dis(x,y)为奇数时&#xff0c;接下来我们讨论有解的情况&#xff0c;大致分…

DevOps之持续集成SonarQube代码质量扫描

SonarQube是一个用于代码质量检测管理的开放平台&#xff0c;可以集成不同的检测工具&#xff0c;代码分析工具&#xff0c;以及持续集成工具。SonarQube 并不是简单地把不同的代码检查工具结果直接显示在 Web 页面上&#xff0c;而是通过不同的插件对这些结果进行再加工处理&a…

变量(网络流模型)

变量 首先最终答案的形式一定是每个变量前面对应一个系数&#xff0c;然后加上一些绝对值&#xff0c;由于每个变量只有两种取法&#xff0c;所以我们考虑使用最小割处理&#xff0c;对于每个变量建一个点分别连到S和T&#xff0c;然后表示选择取哪个&#xff0c;然后会有一边是…

使用VS Code 开发.NET CORE 程序指南

1. 前言近两年来&#xff0c;很多前端的同学都开始将 VSCode 作为前端主力开发工具&#xff0c;其丰富的扩展给程序开发尤其是前端开发带来了很多便利&#xff0c;但是作为微软主力语言的 .NET&#xff0c;却由于有宇宙第一IDE Visual Studio存在&#xff0c;很少有看到有后端同…

用pythonnet为计算机视觉做图像整理

中国的.NETer是国内技术的另类&#xff0c;当他们强调.NET也可以做啥啥时都会给别的技术藐视&#xff0c;毕竟主流都不用.NET。本人这几年其实花在.NET时间也少&#xff0c;都投入在Python/Go社区。可我还是有点工作外的寄托&#xff0c;就是让.NET也有一个很好的推广&#xff…

ABP虚拟文件系统(VirtualFileSystem)实例------定制菜单栏显示用户姓名

ABP默认的MVC启动模板在登录后, 右上角显示的是用户名:如果想让它显示用户的姓名该如何做呢?这就需要用到ABP一个非常强大的功能------虚拟文件系统.前期准备使用ABP CLI创建一个名为AbpStudy的ASP.NET MVC项目:abp new AbpStudy关于MVC的启动模板可以看文档, 这里就不赘述.虚…

.NET中国峰会 参与意愿调查

2014年微软组织成立.NET基金会&#xff0c;微软在成为主要的开源参与者的道路上又前进了一步。2014年以来已经有众多知名公司加入.NET基金会, 仅在平台项目中&#xff0c;.NET平台上有87&#xff05;贡献者其实不在Microsoft工作。将.NET基金会变成一个更加多样化和成员驱动的组…

听我的!美国科技公司这样做Code Review

Code Review&#xff0c;在当代的软件开发中占有重要的一环。虽然国内各大主流公司都已经参照国外同行设立了比较严格的Code Review机制&#xff0c;但是还是有好多大型软件公司以及中小型软件公司还未推行这一重要制度。那么在美国的科技企业中&#xff0c;Code Review推行的怎…

程序员过关斩将--互联网人必备知识cookie和session认证

菜菜&#xff0c;上次你说的cookie和session的文章&#xff0c;我觉得不太具体那你想怎么样具体呢&#xff1f;我自己从网上查了一下&#xff0c;很多关于cookie和session认证的&#xff0c;能不能给我讲讲用户认证呀&#xff0c;可以呀这样我下次再去面试&#xff0c;有可能会…

2019-03-15-算法-进化(有效的数独)

题目描述 判断一个 9x9 的数独是否有效。只需要根据以下规则&#xff0c;验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。上图是一个部分填充的有效的数独。 数独…

net core WebApi——尝试企业微信来开发企业内部应用

前言这几天忙活着别的东西&#xff0c;耽误了很长时间&#xff0c;从文件操作完了之后就在考虑着下一步鼓捣点儿啥&#xff0c;因为最开始的业务开发就是企业微信相关的&#xff0c;这刚好来做个内部应用的小例子玩玩。企业微信前身是企业号&#xff0c;当时微信主推的还是公众…

微软发布了开发社区采用.NET Standard的最新信息

最近&#xff0c;微软发布了开发社区当前采用.NET Standard的最新信息。.NET Standard是API的正式规范&#xff0c;现有.NET实现在不同平台的是通用的&#xff08;从而允许跨平台开发&#xff09;。当前规范&#xff08;版本2.0&#xff09;在两年前发布&#xff0c;在.NET Cor…

卓语言对泛型类的使用

上次发了中文编程语言卓语言《小卓.NET中文编程特点介绍》。这篇文章来看下卓语言对泛型类的使用。泛型是现代编程语言很重要的功能。C#语言可以完全定义和使用泛型类型。卓语言是面向广大非专业人员的&#xff0c;为了减低编程难度&#xff0c;没有实现定义泛型类型&#xff0…

AT2675 [AGC018F] Two Trees(欧拉回路)

AT2675 [AGC018F] Two Trees 首先我们看到1或-1&#xff0c;那么就是限制差距在1以内&#xff0c;然后我们可以想到构造一些东西来满足这种东西&#xff0c;然后我们经常利用的就是欧拉回路。 首先这是两个树&#xff0c;然后我们可以根据儿子个数来判断当前点的奇偶性&#x…