Пример #1
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
        }
Пример #2
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
        }
Пример #3
0
        static void Main(string[] args)
        {
            Show1();
            Console.WriteLine(DomainManagement.IsDeleted("TempDomain11"));

            Console.ReadKey();
        }
Пример #4
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            NatashaController.Builder = (ApplicationBuilder)app;
            DomainManagement.RegisterDefault <AssemblyDomain>();
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseSwagger();

            // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
            // specifying the Swagger JSON endpoint.
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
                c.RoutePrefix = string.Empty;
            });

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                NatashaController.Endpoints = endpoints.DataSources;
            });
        }
Пример #5
0
        public static void Show1()
        {
            string result;
            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Lib", "Sql", "ClassLibrary1.dll");

            using (DomainManagement.CreateAndLock("TempDomain11"))
            {
                var domain    = DomainManagement.CurrentDomain;
                var assemebly = domain.LoadPluginFromStream(path);
                var action    = FastMethodOperator.DefaultDomain()
                                .Using(assemebly)
                                .Body(@"
try{
Class1 a = new Class1();
return  a.Show();
}
catch(Exception e){
    return e.Message;
}
return default;").Return <string>()

                                .Compile <Func <string> >();
                result = action();
                Console.WriteLine(result);
            }
        }
Пример #6
0
        public string GetResult1()
        {
            string result;
            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Lib", "Sql", "ClassLibrary1.dll");

            Assert.True(File.Exists(path));
            using (DomainManagement.CreateAndLock("TempDADomain11"))
            {
                var domain    = DomainManagement.CurrentDomain;
                var assemebly = domain.LoadPlugin(path);
                var action    = FastMethodOperator.UseDomain(domain)
                                .WithCS0104Handler()
                                .Body(@"
try{
Class1 a = new Class1();
return  a.Show();
}
catch(Exception e){
    Console.WriteLine(e.Message);  
    return e.Message;
}
return default;").Return <string>()

                                .Compile <Func <string> >();
                result = action();
                domain.Dispose();
            }
            return(result);
        }
Пример #7
0
        public static void TestMemoery()
        {
            Console.WriteLine("Memory1");
            List <Type> list    = new List <Type>();
            var         domain1 = DomainManagement.Create("TempDomain1");

            for (int i = 0; i < 500; i += 1)
            {
                Console.WriteLine("new");
                NClass nStruct = new NClass();
                nStruct
                .Namespace("Core301")
                .Name($"Test{i}")

                .Ctor(builder => builder
                      .Public()
                      .Param <string>("name")
                      .Body("Name=name;"))
                .PublicField <string>("Name")
                .PublicField <string>("Name1")
                .PublicField <string>("Name2")
                .PublicField <string>("Name3")
                .PublicField <string>("Name4");
                list.Add(nStruct.GetType());
            }
            DomainManagement.Get("TempDomain1").Dispose();
        }
Пример #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);
            }
        }
Пример #9
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();
        }
Пример #10
0
        public unsafe static string Test()
        {
            var dict2 = new Dictionary <int, string>();
            var dict  = new Dictionary <string, int>();

            for (int i = 0; i < 10; i++)
            {
                dict[i.ToString()] = i;
                dict2[i]           = i.ToString();
            }
            var test = dict2.CustomerTree(item => item.ToString());


            var temp   = dict.HashTree();
            var name   = temp.GetType().Name;
            var result = temp["1"];

            //var a = temp.GetKeys(1);
            //var domainName = temp.ProxyType.GetDomain().Name;
            Console.WriteLine(DomainManagement.IsDeleted(name));
            // temp.Dispose();
            for (int i = 0; i < 6; i++)
            {
                GC.Collect();
            }
            return(name);
        }
Пример #11
0
        public static void TestMemoery2()
        {
            Console.WriteLine("Memory2");
            var domain1 = DomainManagement.Create("TempDomain2");

            for (int i = 0; i < 10; i += 1)
            {
                Thread.Sleep(5000);
                Console.WriteLine("new");
                NClass nStruct = new NClass();
                nStruct
                .Namespace("Core30")
                .Name($"Test{i}")

                .Ctor(builder => builder
                      .Public()
                      .Param <string>("name")
                      .Body("Name=name;"))
                .PublicField <string>("Name")
                .PublicField <string>("Name1")
                .PublicField <string>("Name2")
                .PublicField <string>("Name3")
                .PublicField <string>("Name4");
                var type = nStruct.GetType();
            }
            DomainManagement.Get("TempDomain2").Dispose();
            DomainManagement.Get("TempDomain2").Unload();
        }
Пример #12
0
        public void DDReferenceCompile()
        {
            using (DomainManagement.Create("DiffDomainReferenceCompare1").CreateScope())
            {
                Assert.NotEqual("Default", DomainManagement.CurrentDomain.Name);
                AssemblyCSharpBuilder builder1 = new();
                builder1.Add(DefaultUsing.UsingScript + "namespace TestA{ public class A {  public string Name = \"Hello\"; public static NatashaUsingCache Get(){ return null;} }}");
                var assemblyA = builder1
                                .CompileWithReferenceLoadBehavior(LoadBehaviorEnum.UseDefault)
                                .GetAssembly();
                var typeA = assemblyA.GetTypes().Where(item => item.Name == "A").First();
                var objA  = Activator.CreateInstance(typeA);
                Assert.NotNull(assemblyA);
                Assert.True(builder1.Domain.UsingRecorder.HasUsing("TestA"));
            }
            using (DomainManagement.Create("DiffDomainReferenceCompare2").CreateScope())
            {
                AssemblyCSharpBuilder builder2 = new();
                builder2.Add(DefaultUsing.UsingScript + "namespace TestB{ public class A {  public string Name = \"Hello\";  public static NatashaUsingCache Get(){ return null;}  }}");
                var assemblyB = builder2
                                .CompileWithReferenceLoadBehavior(LoadBehaviorEnum.None)
                                .GetAssembly();
                var typeB = assemblyB.GetTypes().Where(item => item.Name == "A").First();
                var objB  = Activator.CreateInstance(typeB);
                Assert.NotNull(assemblyB);
                Assert.True(builder2.Domain.UsingRecorder.HasUsing("TestB"));
            }
            var domain1 = DomainManagement.Get("DiffDomainReferenceCompare1") !;
            var domain2 = DomainManagement.Get("DiffDomainReferenceCompare2") !;

            Assert.True(domain1.Assemblies.Any());
            Assert.Equal(domain1.Assemblies.Count(), domain2.Assemblies.Count());
            Assert.True(domain1.References.Count == domain2.References.Count);
        }
Пример #13
0
        public void DNDASDCompile()
        {
            using (DomainManagement.Random().CreateScope())
            {
                Assert.NotEqual("Default", DomainManagement.CurrentDomain.Name);
                AssemblyCSharpBuilder builder = new();
                builder.AssemblyName = "ASDASD1";
                builder.Add("namespace TestA{ public class A {  public string Name = \"Hello\"; }}");
                var assemblyA = builder.GetAssembly();
                Assert.NotNull(assemblyA);
                Assert.True(builder.Domain.UsingRecorder.HasUsing("TestA"));


                builder.SyntaxTrees.Clear();
                builder.AssemblyName = "ASDASD2";
                builder.Add(builder.Domain.UsingRecorder.ToString() + "namespace TestB{public class B { public B(){ Name=\" World!\"; } public string Name; }}");
                var assemblyB = builder.GetAssembly();
                Assert.True(builder.Domain.UsingRecorder.HasUsing("TestB"));
                Assert.NotNull(assemblyB);

                builder.SyntaxTrees.Clear();
                builder.AssemblyName = "ASDASD3";
                builder.Add(builder.Domain.UsingRecorder.ToString() + "public class C { public static string Show(){ return ((new A()).Name+(new B()).Name); } }");
                var assemblyC  = builder.GetAssembly();
                var type       = assemblyC.GetTypes().Where(item => item.Name == "C").First();
                var methodInfo = type.GetMethod("Show");
                var result     = (string)methodInfo !.Invoke(null, null) !;
                Assert.Equal("Hello World!", result);
            }
        }
Пример #14
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
        }
Пример #15
0
 public void Test3()
 {
     using (DomainManagement.CreateAndLock("CDomain1"))
     {
         var domain = DomainManagement.CurrentDomain;
         Assert.Equal("CDomain1", domain.Name);
     }
 }
Пример #16
0
 public static void Release()
 {
     func = null;
     for (int i = 0; i < count; i++)
     {
         var handler = DomainManagement.Get("test" + i.ToString());
         handler.Dispose();
     }
 }
Пример #17
0
 public void Test2()
 {
     Assert.Equal("11", GetResult2());
     for (int i = 0; i < 6; i++)
     {
         GC.Collect();
         GC.WaitForPendingFinalizers();
     }
     Assert.True(DomainManagement.IsDeleted("TempDomain12"));
 }
Пример #18
0
 public static void CheckAlive()
 {
     for (int i = 0; i < count; i++)
     {
         if (!DomainManagement.IsDeleted("test" + i.ToString()))
         {
             Console.WriteLine($"{i} is aliave!");
         }
     }
 }
Пример #19
0
    public AssemblyDomain(string key) : base(key)
    {
#if !NETSTANDARD2_0
        _load_resolver = new AssemblyDependencyResolver(AppDomain.CurrentDomain.BaseDirectory);
#endif

        ShortReferences = new ShortNameReference();
        DllAssemblies   = new ConcurrentDictionary <string, Assembly>();
        DomainManagement.Add(key, this);
    }
Пример #20
0
 public void Test4()
 {
     using (DomainManagement.CreateAndLock("TempDomain14"))
     {
         var(Assembly, TypeCache) = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Lib", "Sql", "ClassLibrary1.dll");
         Assert.Equal("ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", Assembly.FullName);
         Assert.Equal("Class1", TypeCache["ClassLibrary1.Class1"].Name);
         Assert.Equal("ClassLibrary1.Class1", TypeCache["ClassLibrary1.Class1"].FullName);
     }
 }
Пример #21
0
 public void Test3()
 {
     Assert.Equal("{\"Name\":\"11\"}", GetResult3());
     for (int i = 0; i < 6; i++)
     {
         GC.Collect();
         GC.WaitForPendingFinalizers();
     }
     Assert.False(DomainManagement.IsDeleted("TempDomain13"));
 }
Пример #22
0
        /// <summary>
        /// 创建一个域来初始化编译单元. 此方法创建的实例 instance. <br/>
        /// </summary>
        /// <remarks>
        /// <example>
        /// <code>
        ///
        ///     //使用 NoGlobalUsing 来禁用全局 using 覆盖.(默认开启)
        ///     instance.NoGlobalUsing();
        ///
        ///     //使用 NotLoadDomainUsing 来禁用域内 using 覆盖.(默认开启)
        ///     instance.NotLoadDomainUsing();
        ///
        ///     //使用 ConfigBuilder 方法来配置编译单元.
        ///     instance.ConfigBuilder(bld=>bld);
        ///
        ///     //使用 ConfigCompilerOption 方法来配置编译选项.
        ///     bld=>bld.ConfigCompilerOption(opt=>opt.xxx);
        ///
        ///     //使用 ConfigSyntaxOptions 方法来配置语法选项
        ///     bld=>bld.ConfigSyntaxOptions(opt=>opt.xxx).
        ///
        /// </code>
        /// </example>
        /// </remarks>

        public static T CreateDomain(string domainName, Action <AssemblyCSharpBuilder>?option = default)
        {
            if (domainName.ToLower() == "default")
            {
                return(UseDomain(NatashaReferenceDomain.DefaultDomain, option));
            }
            else
            {
                return(UseDomain(DomainManagement.Create(domainName), option));
            }
        }
Пример #23
0
 public static T Create(string domainName, Action <AssemblyCSharpBuilder> option = default)
 {
     if (domainName == default || domainName.ToLower() == "default")
     {
         return(Use(DomainManagement.Default, option));
     }
     else
     {
         return(Use(DomainManagement.Create(domainName), option));
     }
 }
Пример #24
0
 public void Test1()
 {
     //Assert.Equal("Unable to connect to any of the specified MySQL hosts.",GetResult1());
     GetResult1();
     for (int i = 0; i < 6; i++)
     {
         GC.Collect();
         GC.WaitForPendingFinalizers();
     }
     Assert.True(DomainManagement.IsDeleted("TempDADomain11"));
 }
Пример #25
0
        public static void UnloadDelegate()
        {
            Assert.Equal(3, RunDelegate6());
#if !NETCOREAPP2_2
            for (int i = 0; i < 6; i++)
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
            Assert.True(DomainManagement.IsDeleted("NDelegate6"));
#endif
        }
Пример #26
0
        public void Test1()
        {
            //ForTest1();
            Assert.Equal("HelloTest", ForTest1());
#if !NETCOREAPP2_2
            for (int i = 0; i < 10; i++)
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
            Assert.True(DomainManagement.IsDeleted("SingleDomainAsmTest1"));
#endif
        }
Пример #27
0
        public static int CheckAlive()
        {
            int tempCount = 0;

            for (int i = 0; i < count; i++)
            {
                if (!DomainManagement.IsDeleted("test" + i.ToString()))
                {
                    tempCount++;
                    Console.WriteLine($"{i} is aliave!");
                }
            }
            return(tempCount);
        }
Пример #28
0
        static void Main(string[] args)
        {
            NatashaInitializer.InitializeAndPreheating();
            var domainName = Test();

            for (int i = 0; i < 6; i++)
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
            Console.WriteLine(domainName);
            Console.WriteLine(DomainManagement.IsDeleted(domainName));
            Console.ReadKey();
        }
Пример #29
0
 public static void Testqq()
 {
     Thread.Sleep(5000);
     TestMemoery();
     for (int i = 0; (!DomainManagement.IsDeleted("TempDomain1")) && (i < 15); i++)
     {
         Console.WriteLine($"\t第{i}次!");
         GC.Collect();
         GC.WaitForPendingFinalizers();
         Thread.Sleep(500);
     }
     //Testt();
     Console.WriteLine(DomainManagement.IsDeleted("TempDomain1") ? "回收成功!" : "回收失败!");
 }
Пример #30
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();
        }