首页 | IT新闻 | 硬件 | 操作系统 | 开发 | 网络编程 | 数据库 | 热门框架 | 网络安全 | 组网 | 建站指南 | 网页制作 | 特效 | 实用技巧 | 服务器 | 办公 | QQ | 探索 | 社区

  • 技术部落
  • 部落首页 > 程序开发 > C/C#/C++ > 正文
  • 两个C#动态编译代码的例子
      2007-8-27  来源:博客网  编辑:Jsbulo  热度:

    动态生成代码程序收集NO1:

    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);