C#代码执行者1.0

it2022-05-09  32

动态生成代码程序收集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); 代码执行者1.0 功能:        在TextBox中输入一段C#代码,点击按钮即可运行该代码。 界面预览: 本程序源码参见上面动态编译的例子。 演示程序下载 : Demo

转载于:https://www.cnblogs.com/tuyile006/archive/2007/08/25/866152.html

相关资源:C#微软培训教材(高清PDF)

最新回复(0)