Exemplo n.º 1
0
        public string Execute(string code)
        {
            var task = Task<string>.Factory.StartNew(() =>
            {
            try
            {
                if (!Validate(code)) return "Not implemeted";

                var e = new Evidence();
                e.AddHostEvidence(new Zone(SecurityZone.Untrusted));

                var ps = SecurityManager.GetStandardSandbox(e);
                var security = new SecurityPermission(SecurityPermissionFlag.NoFlags);

                ps.AddPermission(security);

                var setup = new AppDomainSetup { ApplicationBase = Environment.CurrentDirectory };
                var domain = AppDomain.CreateDomain("Sandbox", e, setup, ps);
                AppDomain.CurrentDomain.AssemblyResolve += DomainAssemblyResolve;
                using (var memoryStream = new MemoryStream())
                {
                    var defaultReferences = new[] {"System"};
                    var defaultNamespaces = new[] { "System" };
                    CommonScriptEngine engine = new ScriptEngine(defaultReferences, defaultNamespaces);
                    var options = new ParseOptions(kind: SourceCodeKind.Script, languageVersion: LanguageVersion.CSharp6);

                    foreach (var ns in defaultNamespaces) engine.Execute(string.Format("using {0};", ns), Session);
                    byte[] assembly = null;

                    var resultCode = engine.CompileSubmission<object>(code, Session);
                    resultCode.Compilation.Emit(memoryStream);
                    assembly = memoryStream.ToArray();

                    //var compilationSubmission = Engine.CompileSubmission<dynamic>(code, Session);
                    //compilationSubmission.Compilation.AddReferences(new AssemblyNameReference("System.IO, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"));
                    //compilationSubmission.Compilation.Emit(memoryStream);

                    domain.Load("mscorlib");
                    domain.Load("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
                    domain.Load("Microsoft.Csharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
                    domain.Load("Roslyn.Compilers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
                    domain.Load("Roslyn.Compilers.Csharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");

                    _dynamicAssembly = Assembly.Load(assembly);

                    var loaded = domain.Load(assembly);

                    var submission = loaded.GetTypes().Where(x => x.Name.Contains("Submission")).Last();
                    var methods = submission.GetMethods();
                    var result = methods.Where(x => x.Name.Contains("Factory")).First().Invoke(submission, new[] { Session });

                    if (result != null)
                        return result.ToString();

                    AppDomain.Unload(domain);
                }
            }
            catch (Exception ex)
            {
                return ex.ToString();
            }

            return null;
            });
            var finished = task.Wait(10000);

            if (finished)
            return task.Result;

            return "Timeout";
        }