zoukankan      html  css  js  c++  java
  • C#动态执行代码

    动态执行代码

    代码1
    using System;
    using System.Collections.Generic;
    using System.Reflection;
    using System.Text;
    using System.CodeDom;
    using System.CodeDom.Compiler;



    namespace csrepl {
    class Program {



    static string funcprefix = "using System; "
    + "public delegate void Proc(); "
    + "public class Wrapper { "
    + " public static object Set(string name, object value) { "
    + " AppDomain.CurrentDomain.SetData(name, value); "
    + " return value; "
    + " } "
    + " public static object Get(string name) { "
    + " return AppDomain.CurrentDomain.GetData(name); "
    + " } "
    + " public static object Invoke(Proc proc) { "
    + " proc(); "
    + " return null; "
    + " } "
    + " public static object Eval() { return ";
    static string funcsuffix = "; } }";




    static string StringEval(string expr) {
    string program = funcprefix + expr + funcsuffix;



    ICodeCompiler compiler
    = CodeDomProvider.CreateProvider("C#").CreateCompiler();
    CompilerParameters cp
    = new CompilerParameters();
    cp.GenerateExecutable
    = false;
    cp.GenerateInMemory
    = true;



    CompilerResults results
    = compiler.CompileAssemblyFromSource(cp, program);
    if (results.Errors.HasErrors) {
    if (results.Errors[0].ErrorNumber == "CS0029")
    return StringEval("Invoke(delegate { " + expr + "; })");
    return results.Errors[0].ErrorText;
    }
    else {
    Assembly assm
    = results.CompiledAssembly;
    Type target
    = assm.GetType("Wrapper");
    MethodInfo method
    = target.GetMethod("Eval");
    object result = method.Invoke(null, null);
    return result == null ? null : result.ToString();
    }
    }



    static void Main(string[] args) {



    while (true ) {
    Console.Write(
    "> ");
    Console.Out.Flush();
    string expr = Console.ReadLine();
    if (expr == null)
    break;
    try {
    string result = StringEval(expr);
    Console.WriteLine(result);
    }
    catch (TargetInvocationException ex) {
    Console.WriteLine(ex.InnerException.GetType().Name
    + ": " + ex.InnerException.Message);
    }
    catch (Exception ex) {
    Console.WriteLine(ex.GetType().Name
    + ": " + ex.Message);
    }
    }

    }
    }
    }
    代码2
    private void Compiler(string code)
    {
    CompilerParameters vCompilerParameters
    = new CompilerParameters();
    vCompilerParameters.GenerateExecutable
    = false;
    vCompilerParameters.GenerateInMemory
    = true;
    vCompilerParameters.ReferencedAssemblies.Add(
    "System.Windows.Forms.dll");
    string vSource =
    "using System.Windows.Forms;\n" +
    "public class Temp\n" +
    "{\n" +
    " public void Test()\n" +
    " {\n" +
    " " + code + "\n" +
    " }\n" +
    "}\n";
    CompilerResults vCompilerResults
    =
    CodeDomProvider.CreateProvider(
    "CSharp").CompileAssemblyFromSource(vCompilerParameters, vSource);

    Assembly vAssembly
    = vCompilerResults.CompiledAssembly;
    object vTemp = vAssembly.CreateInstance("Temp");
    MethodInfo vTest
    = vTemp.GetType().GetMethod("Test");
    vTest.Invoke(vTemp,
    null);
    }



    string code = "int sum = 0;\nfor(int i = 0; i < 100; i++)\n{\nsum += i;\n}\nMessageBox.Show(sum.ToString());";
    Compiler(code);

  • 相关阅读:
    HBase 超详细介绍
    写在之前
    【CF】38E Let's Go Rolling! (dp)
    [CF] E. Camels
    CF9D How many trees? (dp)
    [CF] 8C Looking for Order
    CF dp 题(1500-2000难度)
    NOIP原题板刷
    Codeforces Round #595 (Div. 3) 题解
    CSP-S2019 停课日记
  • 原文地址:https://www.cnblogs.com/kidfruit/p/1719524.html
Copyright © 2011-2022 走看看