【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,一经查实,立即删除!

相关文章

牛客练习赛69 解方程

解方程 ∑d∣nf(d)σp(nd)σq(n)f∗σpσq有σk∑d∣ndkidk∗If∗idp∗Iidq∗I∑d∣nμ(d)μ∗I对上面式子同时卷上一个μf∗idpidq因为idk是一个完全积性函数&#xff0c;所以idp−1μidpidk∗(μidp)∑d∣ndkμ(nd)(nd)k∑d∣nμ(d)ϵfidq∗(μidp)f(n)∑d∣nμ(d)dp(nd)qf(1…

2019-03-09-算法-进化(旋转数组)

题目描述 给定一个数组&#xff0c;将数组中的元素向右移动 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: [1,2,3,4,5,6,7] 和 k 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4]示…

.NET 程序员如何学习Vue

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

P3714 [BJOI2017]树的难题(点分治/线段树/单调队列)

P3714 [BJOI2017]树的难题 求解树上长度在L到R的树链中颜色段权值和最大的链。 首先求解树上链的问题&#xff0c;而且限制了链的长度&#xff0c;那么我们需要点分治处理&#xff0c;然后考虑每次分治&#xff0c;我们可以把链分成两类&#xff0c;先处理同色连通块&#xf…

A Simple Math Problem(2020 ICPC 江西省省赛)

A Simple Math Problem ∑i1n∑j1if(j)[gcd(i,j)1]∑i1n∑jinf(i)[gcd(i,j)1]∑i1n∑j1nf(i)[gcd(i,j)1]−∑i1n∑j1if(i)[gcd(i,j)1]f(1)∑d1nμ(d)nd∑i1ndf(id)−∑i1nf(i)ϕ(i)f(1)然后就可以O(nlog⁡n)求解了\sum_{i 1} ^{n} \sum_{j 1} ^{i} f(j)[gcd(i, j) 1]\\ \sum…

2019-03-10-算法-进化(存在重复)

给定一个整数数组&#xff0c;判断是否存在重复元素。 如果任何值在数组中出现至少两次&#xff0c;函数返回 true。如果数组中每个元素都不相同&#xff0c;则返回 false。 示例 1: 输入: [1,2,3,1] 输出: true示例 2: 输入: [1,2,3,4] 输出: false示例 3: 输入: [1,1,1,…

P3233 [HNOI2014]世界树(虚树/倍增/动态规划)

P3233 [HNOI2014]世界树 每次给出mi个点&#xff0c;查询每个点控制的点的个数&#xff0c;每个点由离他最近编号最小的点控制。 首先按照套路建出虚树&#xff0c;注意特判1节点&#xff0c;然后用栈维护右链&#xff0c;然后不断弹栈建边。 然后进行dp&#xff0c;求解出虚…

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

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

Absolute Math (HDU 6868)

Absolute Math 定义c(n)theprimenhave&#xff0c;c(1)0,c(2)1,c(4)1,c(6)2f(n)∑d∣nμ(d)22c(n)f(ab)f(a)f(b)f(gcd(a,b))∑i1mf(n)f(i)f(gcd(n,i))f(n)∑d∣n1f(d)∑i1mdf(id)[gcd(i,nd)1]f(n)∑d∣n1f(d)∑k∣ndμ(k)∑i1mkdf(ikd)Tkdf(n)∑T∣n∑i1mTf(iT)∑d∣Tμ(Td)f(d…

2019-03-10-算法-进化(只出现一次的数字)

题目描述 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 说明&#xff1a; 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗&#xff1f; 示例 1: 输入: [2,2,1] 输出: 1…

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

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

CF871E Restore the Tree(构造/哈希)

CF871E Restore the Tree 对于一个n个点的树&#xff0c;给定k个点以及这k个点到n个点的距离&#xff0c;然后构造出一颗合法的树。如果不存在合法的树输出-1&#xff0c;任意输出一组解即可。 首先处理在关键点链上的节点&#xff0c;对于两个关键点&#xff0c;有且仅有他们…

Battlestation Operational HDU 6134

Battlestation Operational ∑i1n∑j1i⌈ij⌉[gcd(i,j)1]∑i1n∑j1i(ij1)[gcd(i,j)1]−∑i1n∑j1i[gcd(i,j)1,j∣i]∑i1n∑j1i(ij1)[gcd(i,j)1]−n∑i1n∑j1iij[gcd(i,j)1]∑i1n∑j1i[gcd(i,j)1]−n∑i1n∑j1iij[gcd(i,j)1]∑i1ϕ(i)−n∑i1n∑j1iij[gcd(i,j)1]∑d1nμ(d)∑i1n…

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;是我见…

AT2645 [ARC076D] Exhausted?(Hall定理推论/线段树+扫描线)

AT2645 [ARC076D] Exhausted? 对于一个二分图左边点连接的是右边点的一个前缀和一个后缀&#xff0c;求解最大匹配。 首先不能直接求解最大匹配&#xff0c;但是我们可以利用Hall定理的推论求解 ∣U∣−max(∣X∣−N(∣X∣))|U|-max(|X|-N(|X|))∣U∣−max(∣X∣−N(∣X∣))…

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;大致分…

观星(计算几何/凸包/多边形面积)

观星 对于平面上有n个点分为三类&#xff0c;要求寻找一个三角形&#xff0c;三个顶点分别属于这三类&#xff0c;求解最大面积。 N<3000 首先考虑到O(n2)O(n^2)O(n2)的枚举&#xff0c;然后对于另外一种考虑这个点的位置&#xff0c;显然它应该在凸包上&#xff0c;因为我…

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

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