Beispiel #1
0
        // 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);
        }