页首Html代码

程序集 动态编译运行C#代码

 

 点击按钮执行代码

      textOutput.Background = Brushes.White;
      var driver = new CodeDriverInAppDomain();
      bool isError;
      textOutput.Text = driver.CompileAndRun(textCode.Text, out isError);
      if (isError)
      {
        textOutput.Background = Brushes.Red;
      }

 

 

CompileAndRun的代码

    public string CompileAndRun(string code, out bool hasError)
    {
      AppDomain codeDomain = AppDomain.CreateDomain("CodeDriver");

      CodeDriver codeDriver = (CodeDriver)
            codeDomain.CreateInstanceAndUnwrap("DynamicAssembly",
                  "Wrox.ProCSharp.Assemblies.CodeDriver");

      string result = codeDriver.CompileAndRun(code, out hasError);

      AppDomain.Unload(codeDomain); 

      return result;
    }
  public class CodeDriver : MarshalByRefObject
  {
    private string prefix =
       "using System;" +
       "public static class Driver" +
       "{" +
       "   public static void Run()" +
       "   {";

    private string postfix =
       "   }" +
       "}";


    public string CompileAndRun(string input, out bool hasError)
    {
      hasError = false;
      string returnData = null;

      CompilerResults results = null;
      using (var provider = new CSharpCodeProvider())
      {
        var options = new CompilerParameters();
        options.GenerateInMemory = true;

        var sb = new StringBuilder();
        sb.Append(prefix);
        sb.Append(input);
        sb.Append(postfix);

        results = provider.CompileAssemblyFromSource(options, sb.ToString());
      }

      if (results.Errors.HasErrors)
      {
        hasError = true;
        var errorMessage = new StringBuilder();
        foreach (CompilerError error in results.Errors)
        {
          errorMessage.AppendFormat("{0} {1}", error.Line, error.ErrorText);
        }
        returnData = errorMessage.ToString();
      }
      else
      {
        TextWriter temp = Console.Out;
        var writer = new StringWriter();
        Console.SetOut(writer);
        Type driverType = results.CompiledAssembly.GetType("Driver");

        driverType.InvokeMember("Run", BindingFlags.InvokeMethod |
              BindingFlags.Static | BindingFlags.Public,
              null, null, null);
        
        Console.SetOut(temp);

        returnData = writer.ToString();
      }

      return returnData;
    }
  }

 

还可参考

https://www.cnblogs.com/nanfei/p/6046128.html

 

posted @ 2021-03-03 09:54  noigel  阅读(226)  评论(0编辑  收藏  举报
js脚本