中文 | English
基于roslyn的动态编译库,为您提供高效率、高性能、可追踪的动态构建方案,兼容stanadard2.0, 只需原生C#语法不用Emit。 让您的动态方法更加容易编写、跟踪、维护。 欢迎参与讨论:点击加入Gitter讨论组
| Scan Name | Status |
|---|---|
| Document | |
| Lang | |
| Rumtime | |
| OS |
| CI Platform | Build Server | Master Build | Master Test |
|---|---|---|---|
| Travis | Linux/OSX | ||
| AppVeyor | Windows/Linux | ||
| Azure | Windows | ||
| Azure | Linux | ||
| Azure | Mac |
Teng(359768998@qq.com)
- 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扩展。
<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;
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关键字哦。//定义一个委托
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;" 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>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>>()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();Natasha的动态调用模块: 已移至【NCaller】
-
测试计划(等待下一版本bechmark):
- 动态函数性能测试(对照组: emit, origin)
- 动态调用性能测试(对照组: 动态直接调用,动态代理调用,emit, origin)
- 动态克隆性能测试(对照组: origin)
- 远程动态封装函数性能测试(对照组: 动态函数,emit, origin)