Skip to content

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

License

iamshen/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

发布计划(Publish Plan)

  • 2019-06-25 : 发布v0.7.1.2, 修复跨平台调用,将object类型纳入一次性赋值类型,增加类扩展方法。
  • 2019-06-26 : 发布v0.7.2.0, 升级到Standard的程序集操作,并指定release模式进行编译。
  • 2019-08-01 : 发布v1.0.0.0, 发布稳如老狗版,抛弃Emit农耕铲,端起Roslyn金饭碗。



使用方法(User Api):


首先编辑您的工程文件:

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


使用 FastMethodOperator 快速构建函数:

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


使用 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;"          


动态调用普通类:

public class A
{
   public int Age;
   public DateTime Time;
   public B Outter = new B();
}

public class B
{
   public string Name;
   public B()
   {
      Name = "小明"
   }
}

//如果是运行时动态生成类,也同样


//调用方式一
var handler = DynamicOperator.GetOperator(typeof(A));

handler["Age"].IntValue = 100;                                    // Set Operator

Console.WriteLine(handler["Time"].DateTime);                      // Get Operator

handler["Outter"].OperatorValue["Name"].StringValue = "NewName"   // Link Operator



//调用方式二

var handler EntityOperator.Create(typeof(A));

handler.New();

handler.Set("Age",100);                                           // Set Operator

Console.WriteLine(handler.Get<DateTime>("Time"));                 // Get Operator

handler.Get("Outter")["Name"].Set("NewName");                     // Link Operator


动态调用静态类:

public static class A
{
   public static int Age;
   public static DateTime Time;
   public static B Outter = new B();
}

public class B
{
   public string Name;
   public B()
   {
      Name = "小明";
   }
}

//如果是运行时动态生成类,也同样


//调用方式一

DynamicStaticOperator handler = typeof(A);

handler["Age"].IntValue = 100;                                        // Set Operator

Console.WriteLine(handler["Time"].DateTime);                          // Get Operator

handler.Get["Outter"].OperatorValue["Name"].StringValue = "NewName"   // Link Operator


//调用方式二

var handler = StaticEntityOperator.Create(type);

handler["Age"].Set(100);                                          // Set Operator

Console.WriteLine(handler["Time"].Get<DateTime>());               // Get Operator

handler.Get("Outter").Set(Name,"NewName");                        // Link Operator


方便的扩展


使用Natasha的类扩展:

Example:  
        Type : Dictionary<string,List<int>>[] 
        
        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


使用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的动态扩展:

Example:  

        Using : Natasha.Caller; 
        var instance = new ClassA();
        
        //Get DynamicHandler on the instance.
        var handler = instance.Caller();
        
        //Get Operation
        handler.Get<string>("MemberName");
        handler["MemberName"].Get<string>();
        
        //Set Operation
        handler.Set("MemberName",AnythingValue);
        handler["MemberName"].Set(AnythingValue);



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

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

License

FOSSA Status

About

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

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C# 96.9%
  • R 2.4%
  • HTML 0.7%