public static void Main(string[] args) { Console.WriteLine("Hello World!"); var code = "Console.WriteLine(\"Hello World!\");"; AssemblyDomain.Init(); var outputData = string.Empty; using (var output = WeihanLi.Common.Helpers.ConsoleOutput.Capture().GetAwaiter().GetResult()) { using var domain = DomainManagement.Random; var action = NDelegate .UseDomain(domain) .UseRandomName() .Action(code) ; action.Invoke(); outputData = output.StandardOutput; } Console.WriteLine($"outputData:{outputData}"); Console.WriteLine("completed."); Console.ReadLine(); }
public static unsafe DictBase Ctor(Type type) { //获得动态生成的类型 var proxyType = DictBuilder.InitType(type, AlgorithmKind.Fuzzy); //加入缓存 var script = $"return new {proxyType.GetDevelopName()}();"; _str_cache[type.GetDevelopName()] = script; _type_cache[type] = script; var newFindTree = "var str = arg.GetDevelopName();"; newFindTree += BTFTemplate.GetGroupPrecisionPointBTFScript(_str_cache, "str"); newFindTree += $"return PrecisionDictBuilder.Ctor(arg);"; //生成脚本 var newAction = NDelegate .UseDomain(type.GetDomain(), builder => builder.LogCompilerError()) .UnsafeFunc <Type, DictBase>(newFindTree, _type_cache.Keys.ToArray(), "NMS.Leo.NCallerDynamic"); HashDictOperator.CreateFromString = (delegate * managed <Type, DictBase>)(newAction.Method.MethodHandle.GetFunctionPointer()); return((DictBase)Activator.CreateInstance(proxyType)); }
public void Test2() { #if !NETCOREAPP2_2 using (DomainManagement.CreateAndLock("Default1")) { var domain = DomainManagement.CurrentDomain; var assembly = domain.CreateAssembly("ClassLibrary1"); assembly.AddScript("using System;namespace ClassLibrary1{ public class Class1{public string name;}}"); var result2 = assembly.GetAssembly(); var type2 = result2.GetTypes().First(item => item.Name == "Class1"); try { var assembly1 = domain.CreateAssembly("AsmTest2"); assembly1.AddScript("using System;namespace ClassLibrary1{ public class Class1{public string name;}}"); var result1 = assembly1.GetAssembly(); var type1 = result1.GetTypes().First(item => item.Name == "Class1"); Assert.NotEqual(result1, result2); Assert.Equal(type1.Name, type2.Name); lock (obj) { var func = NDelegate.UseDomain(domain) .AddUsing("ClassLibrary1") .Func <object>("return new Class1();"); Assert.Equal(result2, func().GetType().Assembly); } } catch (Exception ex) { Assert.NotNull(ex); } } #endif }
public void Test1() { #if !NETCOREAPP2_2 lock (obj) { using (DomainManagement.CreateAndLock("TestSame")) { var domain = DomainManagement.CurrentDomain; var assembly = domain.CreateAssembly("ababab"); assembly.AddScript("using System;namespace ClassLibrary1{ public class Class1{public string name;}}"); var result2 = assembly.GetAssembly(); var type2 = result2.GetTypes().First(item => item.Name == "Class1"); string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Lib", "Repeate", "ClassLibrary1.dll"); var result1 = domain.LoadPluginFromStream(path); var type1 = result1.GetTypes().First(item => item.Name == "Class1"); domain.Remove(path); Assert.Equal("TestSame", DomainManagement.CurrentDomain.Name); Assert.NotEqual(result1, result2); Assert.Equal(type1.Name, type2.Name); var func = NDelegate.UseDomain(domain).AddUsing("ClassLibrary1").Func <object>("return new Class1();"); Assert.Equal(result2, func().GetType().Assembly); } } #endif }
static void Main(string[] args) { NatashaInitializer.Initialize(false); string text = @"namespace HelloWorld { public class Test { public Test(){ Name=""111""; } public string Name; public int Age{get;set;} } }"; //根据脚本创建动态类 AssemblyCSharpBuilder oop = new AssemblyCSharpBuilder("test"); oop.Domain = DomainManagement.Random; oop.Domain.AddReferencesFromDllFile(typeof(object).Assembly.Location); oop.Add(text); Type type = oop.GetTypeFromShortName("Test"); Console.WriteLine(type.Name); var action = NDelegate.UseDomain(oop.Domain).Action(""); var a = action.Method; Console.WriteLine(action.Method.Module.Assembly); Console.WriteLine(DomainManagement.IsDeleted(action.GetDomain().Name)); Console.ReadKey(); }
public void Test3() { #if !NETCOREAPP2_2 NSucceedLog.Enabled = true; using (DomainManagement.CreateAndLock("Default2")) { var domain = DomainManagement.CurrentDomain; var assembly = domain.CreateAssembly("ClassLibrary1"); assembly.AddScript("using System;namespace ClassLibrary1{ public class Class1{public string name;}}"); var result2 = assembly.GetAssembly(); var type2 = result2.GetTypes().First(item => item.Name == "Class1"); //domain.RemoveAssembly(result2); var assembly1 = domain.CreateAssembly("AsmTest22"); assembly1.AddScript("using System;namespace ClassLibrary1{ public class Class1{public string name;}}"); var result1 = assembly1.GetAssembly(); var type1 = result1.GetTypes().First(item => item.Name == "Class1"); Assert.NotEqual(result1, result2); Assert.Equal(type1.Name, type2.Name); domain.Remove(result2); lock (obj) { //Class1 同时存在于 ClassLibrary1 和 AsmTest22 中 var func = NDelegate.UseDomain(domain).AddUsing("ClassLibrary1").Func <object>("return new Class1();"); Assert.Equal(result1, func().GetType().Assembly); } } #endif }
public static Func <string, DictBase> Ctor(Type type) { StrTypeCache[type.GetDevelopName()] = type; //获得动态生成的类型 Type result = DictBuilder.InitType(type, Core.Model.FindTreeType.Fuzzy); //加入缓存 string script = $"return new {result.GetDevelopName()}();"; _str_cache[type.GetDevelopName()] = script; _type_cache[type] = script; //生成脚本 PDC <Type, DictBase> handler = default; if (_pdc.BuilderInfo != null) { handler = _pdc | _str_cache; } else { handler = (_pdc | _str_cache | DictOperator.CreateFromString | Ctor) % CallerManagement.GetTypeFunc; } return(NDelegate.UseDomain(type.GetDomain(), builder => builder.LogCompilerError()).UnsafeFunc <string, DictBase>(handler.ToString(), _type_cache.Keys.ToArray(), "NCallerDynamic", "NCaller.Builder")); }
static void Main(string[] args) { AssemblyDomain.Init(); var hwFunc = FastMethodOperator .RandomDomain() .Param(typeof(string), "str1") .Param <string>("str2") .Body("return str1+str2;") .Return <string>() .Compile <Func <string, string, string> >(); Console.WriteLine(hwFunc("Hello", " World!")); var a123 = NClass.UseDomain(typeof(Program).GetDomain()); var domain = DomainManagement.Random; var type = NDelegate.UseDomain(domain).GetType("public class A{ public A(){Name=\"1\"; }public string Name;}"); var func = NDelegate.UseDomain(domain).Func <string>("return (new A()).Name;"); Console.WriteLine(type.FullName); Console.WriteLine(func()); //type.RemoveReferences(); type = NDelegate.UseDomain(domain).GetType("public class A{ public A(){Name=\"2\"; }public string Name;}"); func = NDelegate.UseDomain(domain).Func <string>("return (new A()).Name;"); Console.WriteLine(type.FullName); Console.WriteLine(func()); domain = DomainManagement.Create("a"); using (DomainManagement.Lock("a")) { Console.WriteLine(domain == (AssemblyDomain)AssemblyLoadContext.CurrentContextualReflectionContext); } }
public void TestDelegateEqual() { var domain = DomainManagement.Random; var action = NDelegate.UseDomain(domain).Action( @"int i = 1+1;"); Assert.Equal(domain, action.GetDomain()); }
public void LoadFromDll1() { string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Lib", "Static", "ClassLibrary6.dll"); var domain = DomainManagement.Random; var assemebly = domain.LoadPluginFromFile(path); var action = NDelegate .UseDomain(domain) .Func <string>("Test.Instance.Name=\"11\"; return Test.Instance.Name;", assemebly); Assert.Equal("11", action()); }
/// <summary> /// 初始化 Natasha 组件并预热 /// </summary> /// <returns></returns> public static async Task InitializeAndPreheating(bool initializeReference = true) { Initialize(initializeReference); var domain = DomainManagement.Random; domain.AddReferencesFromDllFile(typeof(object).Assembly.Location); var action = NDelegate.UseDomain(domain).Action(""); action(); action.DisposeDomain(); }
/// <summary> /// 对类型进行初始化配置 /// </summary> /// <param name="freeSql"></param> /// <param name="types"></param> public static void InitializeTypes(IFreeSql freeSql, params Type[] types) { var domain = DomainManagement.Random; foreach (var item in types) { if (item.IsClass) { _realTableNameMapping[item] = NDelegate .UseDomain(domain) .Func <IFreeSql, string>($"TableInfomation<{item.GetDevelopName()}>.Initialize(arg);return TableInfomation<{item.GetDevelopName()}>.TableName;")(freeSql); } } domain.Dispose(); }
static void Main(string[] args) { NatashaInitializer.Initialize(); string text = @"namespace HelloWorld { public class Test { public Test(){ Name=""111""; } public string Name; public int Age{get;set;} } }"; //根据脚本创建动态类 AssemblyCSharpBuilder oop = new AssemblyCSharpBuilder("test"); oop.Domain = DomainManagement.Random; //oop.Domain.AddReferencesFromDllFile(typeof(object).Assembly.Location); oop.Add(text); Type type = oop.GetTypeFromShortName("Test"); Console.WriteLine(type.Name); var action = NDelegate.UseDomain(oop.Domain).Action(""); var a = action.Method; Console.WriteLine(action.Method.Module.Assembly); Console.WriteLine(DomainManagement.IsDeleted(action.GetDomain().Name)); //var nClass = NClass // .RandomDomain(); //nClass.DelegateHandler. //type = NClass // .RandomDomain().Namespace("") // .Name("Test") // .Ctor(item => item // .Public() // .Body("Name = null;") // ) // .PublicField<string>("Name") // .GetType(); //type.Assembly //CSharpScript.EvaluateAsync Console.ReadKey(); }
public void TestTypeEqual() { var domain = DomainManagement.Random; var type = NDelegate.UseDomain(domain, builder => { builder .CustomerUsing() //使用用户自定义的Using .SetAssemblyName("MyAssemblyName") //设置程序集名 .ThrowAndLogCompilerError() //抛出并记录编译器的异常 .ThrowSyntaxError() //抛出语法树异常 .UseStreamCompile(); //使用流编译 }).GetType( @"public class DomainTest1{ public string Name; public int Operator; }"); Assert.Equal(domain, type.GetDomain()); }
public void DiffDllTest2() { string path1 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Lib", "Diff", "fileV1", "asmV1", "TestRefererenceLibrary.dll"); string path2 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Lib", "Diff", "fileV1", "asmV2", "TestReferenceLibrary2.dll"); var domain = DomainManagement.Random; //Load B => C v1.0 var assembly = domain.LoadPlugin(path1); //Load A => C v2.0 var assembly2 = domain.LoadPlugin(path2); var result = NDelegate.UseDomain(domain).Func <string>("return new TestRefererenceLibrary2.TestReference().Get();")(); var result2 = NDelegate.UseDomain(domain).Func <string>("return new TestRefererenceLibrary.TestReference().Get();")(); Assert.Equal(result, result2); Assert.Equal("2.0.0.0", result); }
/// <summary> /// 初始化 Natasha 组件并预热 /// </summary> /// <returns></returns> public static async Task InitializeAndPreheating(bool initializeReference = true) { await Initialize(initializeReference); var domain = DomainManagement.Random; if (!initializeReference) { domain.AddReferencesFromDllFile(typeof(object).Assembly.Location); } #if DEBUG Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); #endif var action = NDelegate.UseDomain(domain).Action(""); #if DEBUG stopwatch.Stop(); Console.WriteLine($"\r\n================ [Preheating]\t预热总时长: {stopwatch.ElapsedMilliseconds}ms ================ \r\n"); #endif action(); action.DisposeDomain(); }
static void Main(string[] args) { NatashaComponentRegister.RegistDomain <NatashaAssemblyDomain>(); NatashaComponentRegister.RegistCompiler <NatashaCSharpCompiler>(); NatashaComponentRegister.RegistSyntax <NatashaCSharpSyntax>(); //var hwFunc = FastMethodOperator // .RandomDomain() // .Param(typeof(string), "str1") // .Param<string>("str2") // .Body("return str1+str2;") // .Return<string>() // .Compile<Func<string, string, string>>(); //Console.WriteLine(hwFunc("Hello", " World!")); var a123 = NClass.UseDomain(typeof(Program).GetDomain()); var domain = DomainManagement.Random; var type = NDelegate.UseDomain(domain, item => item.AssemblyName = "a").GetType($"[assembly: AssemblyKeyFileAttribute(\"c:\\\\vs2019\\\\natasha.snk\")]" + "[assembly: AssemblyVersion(\"1.3.3.3\")]public class A{ public A(){Name=\"1\"; }public string Name;}"); var func = NDelegate.UseDomain(domain).Func <string>("return (new A()).Name;"); Console.WriteLine(type.FullName); Console.WriteLine(func()); //type.RemoveReferences(); type = NDelegate.UseDomain(domain, item => item.AssemblyName = "a").GetType($"[assembly: AssemblyKeyFileAttribute(\"c:\\\\vs2019\\\\natasha.snk\")]" + "[assembly: AssemblyVersion(\"2.3.3.4\")]public class A{ public A(){Name=\"2\"; }public string Name;}"); func = NDelegate.UseDomain(domain).Func <string>("return (new A()).Name;"); Console.WriteLine(type.FullName); Console.WriteLine(func()); domain = DomainManagement.Create("a"); using (DomainManagement.Lock("a")) { Console.WriteLine(domain == (NatashaAssemblyDomain)AssemblyLoadContext.CurrentContextualReflectionContext); } Console.ReadKey(); }
static InsertOperator() { if (TableInfomation <TEntity> .PrimaryKey != default && TableInfomation <TEntity> .PrimaryKeyIsLong) { Insert = NDelegate .UseDomain(typeof(TEntity).GetDomain()) .Func <IFreeSql, TEntity[], bool>($@" var insert = arg1.Insert(arg2).IgnoreColumns(PropertiesCache<{typeof(TEntity).GetDevelopName()}>.BlockInsertCoulmns); var id = insert.ExecuteIdentity(); arg2[arg2.Length - 1].{TableInfomation<TEntity>.PrimaryKey} = id; return id != 0; "); } else { Insert = NDelegate .UseDomain(typeof(TEntity).GetDomain()) .Func <IFreeSql, TEntity[], bool>($@" var insert = arg1.Insert(arg2).IgnoreColumns(PropertiesCache<{typeof(TEntity).GetDevelopName()}>.BlockInsertCoulmns); return insert.ExecuteAffrows() == arg2.Length; "); } }
public void Test5() { NSucceedLog.Enabled = true; #if !NETCOREAPP2_2 lock (obj) { Assembly result1; var domain = DomainManagement.Random; //var assembly = domain.CreateAssembly("AsmTest1"); //assembly.AddScript("using System;namespace ClassLibrary1{ public class Class1{public string name;}}"); //var result2 = assembly.Compiler(); //var type2 = assembly.GetType("Class1"); //domain.RemoveAssembly(result2); string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Lib", "Repeate", "ClassLibrary1.dll"); result1 = domain.LoadPlugin(path); var type1 = result1.GetTypes().First(item => item.Name == "Class1"); //Assert.NotEqual(result1, result2); //Assert.Equal(type1.Name, type2.Name); var func = NDelegate. UseDomain(domain) .AddUsing("ClassLibrary1") .Func <object>("return new Class1();"); Assert.Equal(result1, func().GetType().Assembly); domain.RemoveReference(path); } #endif }
static void Main(string[] args) { var a123 = NClass.UseDomain(typeof(Program).GetDomain()); var domain = DomainManagement.Random; var type = NDelegate.UseDomain(domain).GetType("public class A{ public A(){Name=\"1\"; }public string Name;}"); Console.WriteLine(type.FullName); var func = NDelegate.UseDomain(domain).Func <string>("return (new A()).Name;"); Console.WriteLine(func()); type.RemoveReferences(); type = NDelegate.UseDomain(domain).GetType("public class A{ public A(){Name=\"2\"; }public string Name;}"); func = NDelegate.UseDomain(domain).Func <string>("return (new A()).Name;"); Console.WriteLine(type.FullName); Console.WriteLine(func()); domain = DomainManagement.Create("a"); using (DomainManagement.Lock("a")) { Console.WriteLine(domain == (AssemblyDomain)AssemblyLoadContext.CurrentContextualReflectionContext); } }
private static Action <Dictionary <string, LeoMember> > InitMetadataMappingCaller(Type runtimeProxyType) { return(NDelegate .UseDomain(runtimeProxyType.GetDomain()) .Action <Dictionary <string, LeoMember> >($"{runtimeProxyType.GetDevelopName()}.InitMetadataMapping(obj);")); }
public DynamicCacheBuilder(IDictionary <TKey, TValue> pairs, DyanamicCacheDirection queryDirection = DyanamicCacheDirection.Both) { if (queryDirection != DyanamicCacheDirection.ValueToKey) { AnonymousRTD _r2d_handler = AnonymousRTD.UseDomain(typeof(TKey).GetDomain()); var key_builder = new Dictionary <TKey, string>(); foreach (var item in pairs) { key_builder[item.Key] = $"return {_r2d_handler.AddValue(item.Value)};"; } StringBuilder keyBuilder = new StringBuilder(); keyBuilder.Append(ScriptKeyAction(key_builder)); keyBuilder.Append("return default;"); var method = typeof(Func <TKey, TValue>).GetMethod("Invoke"); _r2d_handler.BodyAppend(FakeMethodOperator.RandomDomain() .UseMethod(method) .Unsafe() .StaticMethodBody(keyBuilder.ToString()) .Script); var type = _r2d_handler.Complie(); GetValue = NDelegate .UseDomain(typeof(TKey).GetDomain()) .Func <Func <TKey, TValue> >($"return {_r2d_handler.TypeName}.Invoke;", type)(); } if (queryDirection != DyanamicCacheDirection.KeyToValue) { AnonymousRTD _r2d_handler = AnonymousRTD.UseDomain(typeof(TKey).GetDomain()); var value_builder = new Dictionary <TValue, string>(); foreach (var item in pairs) { if (!value_builder.ContainsKey(item.Value)) { value_builder[item.Value] = $"return new {typeof(TKey).GetDevelopName()}[]{{{_r2d_handler.AddValue(item.Key)}"; } else { value_builder[item.Value] += $",{_r2d_handler.AddValue(item.Key)}"; } } var temp_value_buidler = new Dictionary <TValue, string>(); foreach (var item in value_builder) { temp_value_buidler[item.Key] = item.Value + "};"; } StringBuilder valueBuilder = new StringBuilder(); valueBuilder.Append(ScriptValueAction(temp_value_buidler)); valueBuilder.Append("return null;"); var method = typeof(Func <TValue, TKey[]>).GetMethod("Invoke"); _r2d_handler.Body(FakeMethodOperator.RandomDomain() .UseMethod(method) .Unsafe() .StaticMethodBody(valueBuilder.ToString()) .Script); var type = _r2d_handler.Complie(); GetKeys = NDelegate .UseDomain(typeof(TValue).GetDomain()) .Func <Func <TValue, TKey[]> >($"return {_r2d_handler.TypeName}.Invoke;", type)(); } }
public static Func <object, object> Create(Type type) { return(NDelegate.UseDomain(type.GetDomain()).Func <object, object>($"return CloneOperator.Clone(({type.GetDevelopName()})arg);", type, "DeepClone")); }