public ActionResult Index(Guid? s = null) { var viewModel = new IndexViewModel("Code Editor") { Source = s.HasValue ? (string) MemoryCache.Default[s.ToString()] : StartSource }; return View(viewModel); }
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); } }