首页 | IT新闻 | 硬件 | 操作系统 | 开发 | 网络编程 | 数据库 | 热门框架 | 网络安全 | 组网 | 建站指南 | 网页制作 | 特效 | 实用技巧 | 服务器 | 办公 | QQ | 探索 | 社区
|
两个C#动态编译代码的例子
动态生成代码程序收集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); 相关链接
频道热门
热门新闻
|
精粹集锦
特别推荐
频道精选
|