Skip to content

tmoonlight/Natasha

 
 

Repository files navigation

中文 | English

Natasha

Member project of .NET Core Community NuGet Badge Gitter Badge GitHub license

    基于roslyn的动态编译库,为您提供高效率、高性能、可追踪的动态构建方案,兼容stanadard2.0, 只需原生C#语法不用Emit。 让您的动态方法更加容易编写、跟踪、维护。 欢迎参与讨论:点击加入Gitter讨论组


类库信息(Library Info)

GitHub tag (latest SemVer) GitHub repo size GitHub commit activity Codecov

Scan Name Status
Document wiki
Lang Complie
Rumtime standard
OS Windows linux mac

持续构建(CI Build Status)

CI Platform Build Server Master Build Master Test
Travis Linux/OSX Build status
AppVeyor Windows/Linux Build status Build status
Azure Windows Build Status Build Status
Azure Linux Build Status Build Status
Azure Mac Build Status Build Status

Wiki审核

Teng(359768998@qq.com)


发布计划(Publish Plan)

  • 2019-08-01 : 发布v1.0.0.0, 发布稳如老狗版,抛弃Emit农耕铲,端起Roslyn金饭碗。
  • 2019-08-02 : 发布v1.0.4.0,支持异步方法还原与构造,增加注解构建。
  • 2019-08-04 : 发布v1.1.0.0,优化编译引擎,区分OS字符,增加异常捕获。
  • 2019-08-05 : 发布v1.2.0.0,支持类/结构体/接口的编译,支持字段模板,增加string扩展。

升级日志




使用方法(User Api):


首先编辑您的工程文件:

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <PreserveCompilationContext>true</PreserveCompilationContext>   <--- 一定要加上这句话
  </PropertyGroup>


异常捕获方法:

  var fastBuilder = FastMethodOperator.New;
  fastBuilder.Complier.Exception;             //编译后异常会进入这里
  if(fastBuilder.Complier.Exception.ErrorFlag == ComplieError.None) 
  {
        //编译成功!
  }
  
  
  var fakeBuilder = FakeMethodOpeartor.New;
  fakeBuilder.Complier.Exception;
  
  
  var classBuilder = New ClassBuilder();
  classBuilder.Complier.Exception;
  


使用 FastMethodOperator 快速构建函数:

var action = FastMethodOperator.New
             .Param<string>("str1")
             .Param(typeof(string),"str2")
             .MethodBody("return str1+str2;")
             .Return<Task<string>>()
             .Complie<Func<string,string,string>>();
                    
var result = action("Hello ","World!");    //result:   "Hello World!"


//增强实现与异步支持


//Complie<T>方法会检测参数以及返回类型,如果其中有任何一处没有指定,那么Complie方法会使用自己默认的参数或者返回值进行填充
//如果是Action<int> 这种带有1个参数的,请使用"arg"


var delegateAction = FastMethodOperator.New

       .UseAsync()
       .MethodBody(@"
               await Task.Delay(100);
               string result = arg1 +"" ""+ arg2; 
               Console.WriteLine(result);
               return result;")
               
       .Complie<Func<string, string, Task<string>>>();
      
string result = await delegateAction?.Invoke("Hello", "World2!");   //result:   "Hello World2!"


//另外如果想使用异步方法,请使用UseAsync方法,或者AsyncFrom<Class>(methodName)这两种方法。
//返回的参数需要您指定Task<>,以便运行时异步调用,记得外面那层方法要有async关键字哦。


使用 DelegateOperator 快速实现委托:

//定义一个委托
public delegate string GetterDelegate(int value);
     
     
     
//方法一     
var action = DelegateOperator<GetterDelegate>.Create("value += 101; return value.ToString();");
string result = action(1);              //result: "102"



//方法二
var action = "value += 101; return value.ToString();".Create<GetterDelegate>();
string result = action(1);              //result: "102"
     


使用 FakeMethodOperator 快速构建函数:

public class Test
{ 
   public string Handler(string str)
   { 
        retrurn null; 
   }
}
var action = FakeMethodOperator.New
             .UseMethod(typeof(Test).GetMethod("Handler"))
             .StaticMethodContent(" str += "" is xxx;"",return str; ")
             .Complie<Func<string,string>>();
                  
string result = action("xiao");              //result: "xiao is xxx;"          


方便的扩展


使用Natasha的类扩展:

Example:          
         
         
        typeof(Dictionary<string,List<int>>[]).GetDevelopName();
        //result:  "Dictionary<String,List<Int32>>[]"
        
              
        typeof(Dictionary<string,List<int>>[]).GetAvailableName();
        //result:  "Dictionary_String_List_Int32____"
        
           
        typeof(Dictionary<string,List<int>>).GetAllGenericTypes(); 
        //result:  [string,list<>,int]
        
        
        typeof(Dictionary<string,List<int>>).IsImplementFrom<IDictionary>(); 
        //result: true
        
        
        typeof(Dictionary<string,List<int>>).IsOnceType();         
        //result: false
        
        
        typeof(List<>).With(typeof(int));                          
        //result: List<int>


使用Natasha的方法扩展:

Example:  

        Using : Natasha.Method; 
        public delegate int AddOne(int value);
        
        
        var action = "return value + 1;".Create<AddOne>();
        var result = action(9);
        //result : 10
        
        
        var action = typeof(AddOne).Create("return value + 1;");
        var result = action(9);
        //result : 10
        
        
        //使用方法扩展快速动态构建委托
         @"string result = str1 +"" ""+ str2;
           Console.WriteLine(result);
           return result;".FastOperator()
               .Param<string>("str1")
               .Param<string>("str2")
               .Return<string>()
               .Complie<Func<string, string, string>>()


使用Natasha的克隆扩展:

Example:  

        Using : Natasha.Clone; 
        var instance = new ClassA();
        var result = instance.Clone();


使用Natasha的快照扩展:

Example:  

        Using : Natasha.Snapshot; 
        var instance = new ClassA();
        
        instance.MakeSnapshot();
        
        // ********
        //  do sth
        // ********
        
        var result = instance.Compare();


Natasha的动态调用模块: 已移至【NCaller】




  • 测试计划(等待下一版本bechmark)

    • 动态函数性能测试(对照组: emit, origin)
    • 动态调用性能测试(对照组: 动态直接调用,动态代理调用,emit, origin)
    • 动态克隆性能测试(对照组: origin)
    • 远程动态封装函数性能测试(对照组: 动态函数,emit, origin)

License

FOSSA Status

About

使用roslyn方案打造高性能动态代码,包括动态构建,运行时编译,深度克隆,实体快照等。(Use Roslyn to create efficient dynamic code. Including dynamic build, deep clone, entity snapshot and so on.)

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • C# 100.0%