zoukankan      html  css  js  c++  java
  • 程序集 动态编译运行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

  • 相关阅读:
    基金相关知识整理
    Apache Shiro反序列化漏洞复现
    payload分离免杀
    Red Team 工具集之网络钓鱼和水坑攻击
    GPP(Group Policy Preference)组策略偏好漏洞利用
    AdFind
    python爬虫之beautifulsoup的使用
    xargs命令_Linux xargs命令:一个给其他命令传递参数的过滤器
    mutillidae之注册页面的Insert型报错注入
    mutillidae之Insert型注入
  • 原文地址:https://www.cnblogs.com/noigel/p/14472766.html
Copyright © 2011-2022 走看看