// returns true if compiled sucessfully public bool CompileAndRun(string input) { if (Input != input || FrameLockChecked != MainForm.Instance.FrameLockCheckBox.Checked) { Input = input; FrameLockChecked = MainForm.Instance.FrameLockCheckBox.Checked; using (CSharpCodeProvider provider = CodeProvider.Value) { CompilerParameters options = new CompilerParameters(); // most recent assembly Assembly myAssembly = AppDomain.CurrentDomain.GetAssemblies() .Where(a => a.GetName().Name.Contains(RebornConsole.Instance.Name)) .OrderByDescending(a => new FileInfo(a.Location).CreationTime).FirstOrDefault(); options.ReferencedAssemblies.Add(myAssembly.Location); foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { if (!asm.GetName().Name.Contains(RebornConsole.Instance.Name) && !asm.IsDynamic) { options.ReferencedAssemblies.Add(asm.Location); } } options.GenerateExecutable = false; options.IncludeDebugInformation = true; options.TempFiles = new TempFileCollection(RebornConsole.TempFolder, false); options.OutputAssembly = string.Format("{0}\\CodeAssembly{1:N}.dll", RebornConsole.TempFolder, Guid.NewGuid()); //options.CompilerOptions = "/d:DEBUG /optimize /unsafe"; options.CompilerOptions = "/optimize /unsafe"; var sb = new StringBuilder(); sb.Append(MainForm.Instance.FrameLockCheckBox.Checked ? PrefixWithFrameLock : Prefix); sb.Append(input); sb.Append(Postfix); Results = provider.CompileAssemblyFromSource(options, sb.ToString()); } } if (Results.Errors.HasErrors) { var errorMessage = new StringBuilder(); var errLineOffset = Prefix.Count(c => c == '\n'); foreach (CompilerError error in Results.Errors) { errorMessage.AppendFormat("{0}) {1}\n", error.Line - errLineOffset, error.ErrorText); } RebornConsole.Log(Colors.Red, errorMessage.ToString()); return(false); } Type driverType = Results.CompiledAssembly.GetType("Driver"); try { driverType.InvokeMember("Run", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, null); } catch (Exception e) { RebornConsole.Log(Colors.OrangeRed, e.ToString()); } return(true); }