Пример #1
0
        public ActionResult Index(Guid? s = null)
        {
            var viewModel = new IndexViewModel("Code Editor")
            {
                Source = s.HasValue
                    ? (string) MemoryCache.Default[s.ToString()]
                    : StartSource
            };

            return View(viewModel);
        }
Пример #2
0
        public ActionResult Index(string source)
        {
            var syntaxTree = CSharpSyntaxTree.ParseText(source);
            var referenceNames = Regex.Matches(source, "using ([^;]+)").Cast<Match>().Select(m => m.Groups[1].Value);
            var references = new List<MetadataReference>
            {
                MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
                MetadataReference.CreateFromFile(Assembly.LoadWithPartialName("System").Location),
                MetadataReference.CreateFromFile(Assembly.LoadWithPartialName("System.Core").Location)
            };
            foreach (var reference in referenceNames)
            {
                try
                {
                    references.Add(MetadataReference.CreateFromFile(Assembly.LoadWithPartialName(reference).Location));
                }
                catch (NullReferenceException)
                {
                }
            }
            var compilation = CSharpCompilation.Create("IPlayer", new[] { syntaxTree }, references, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

            using (var ms = new MemoryStream())
            {
                var result = compilation.Emit(ms);

                if (result.Success)
                {
                    ms.Seek(0, SeekOrigin.Begin);
                    var assembly = Assembly.Load(ms.ToArray());
                    var players = ExtractPlayersFromAssembly(assembly).ToList();
                    SavePlayers(players);

                    var sourceGuid = Guid.NewGuid().ToString();
                    MemoryCache.Default.Add(sourceGuid, source, new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddDays(1) });
                    return RedirectToAction("Index", new {s = sourceGuid});
                }

                var viewModel = new IndexViewModel("Code Editor")
                {
                    Diagnostics = result.Diagnostics.Select(d => d.ToString()).ToList(),
                    Source = source
                };

                return View(viewModel);
            }
        }