Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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
        }
Exemplo n.º 4
0
        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
        }
Exemplo n.º 5
0
        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();
        }
Exemplo n.º 6
0
        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
        }
Exemplo n.º 7
0
        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"));
        }
Exemplo n.º 8
0
        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);
            }
        }
Exemplo n.º 9
0
        public void TestDelegateEqual()
        {
            var domain = DomainManagement.Random;
            var action = NDelegate.UseDomain(domain).Action(
                @"int i = 1+1;");

            Assert.Equal(domain, action.GetDomain());
        }
Exemplo n.º 10
0
        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());
        }
Exemplo n.º 11
0
    /// <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();
    }
Exemplo n.º 12
0
    /// <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();
    }
Exemplo n.º 13
0
        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();
        }
Exemplo n.º 14
0
        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());
        }
Exemplo n.º 15
0
        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);
        }
Exemplo n.º 16
0
    /// <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();
    }
Exemplo n.º 17
0
        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();
        }
Exemplo n.º 18
0
 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;
             ");
     }
 }
Exemplo n.º 19
0
        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
        }
Exemplo n.º 20
0
        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);
            }
        }
Exemplo n.º 21
0
 private static Action <Dictionary <string, LeoMember> > InitMetadataMappingCaller(Type runtimeProxyType)
 {
     return(NDelegate
            .UseDomain(runtimeProxyType.GetDomain())
            .Action <Dictionary <string, LeoMember> >($"{runtimeProxyType.GetDevelopName()}.InitMetadataMapping(obj);"));
 }
Exemplo n.º 22
0
        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)();
            }
        }
Exemplo n.º 23
0
 public static Func <object, object> Create(Type type)
 {
     return(NDelegate.UseDomain(type.GetDomain()).Func <object, object>($"return CloneOperator.Clone(({type.GetDevelopName()})arg);", type, "DeepClone"));
 }