Dynamic compilation of runtime code using roslyn, high performance, traceable. OnlineChat
使用roslyn动态编译运行时代码,高性能、可追踪。 欢迎参与讨论:点击加入Gitter讨论组
Scan Name | Status |
---|---|
Version | |
Lang | |
Size | |
Rumtime | |
OS |
CI Platform | Build Server | Master Build | Master Test |
---|---|---|---|
Travis | Linux/OSX | ||
AppVeyor | Windows/Linux | ||
Azure | Windows | ||
Azure | Linux | ||
Azure | Mac |
- 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金饭碗。
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<PreserveCompilationContext>true</PreserveCompilationContext> <--- 一定要加上这句话
</PropertyGroup>
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!"
//定义一个委托
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"
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
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>
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
Example:
Using : Natasha.Clone;
var instance = new ClassA();
var result = instance.Clone();
Example:
Using : Natasha.Snapshot;
var instance = new ClassA();
instance.MakeSnapshot();
// ********
// do sth
// ********
var result = instance.Compare();
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)