载入中,请稍候……

如何用C#动态编译、执行代码

Admin 于 2008-09-30 09:23:07 发表.NET

订阅: http://www.miniboke.com/Feed/Article_66.aspx
引用: http://www.miniboke.com/Trackback/wzFaMZLaJiFbLzeEmFcI.aspx (UTF-8)
.NET反射、委托技术与设计模式 < 如何用C#动态编译、执行代码 > 在使用 Response.End、Response.Redirect 或 Server.Transfer 时出现 ThreadAbortException

在开始之前,先熟悉几个类及部分属性、方法:CSharpCodeProvider、ICodeCompiler、CompilerParameters、CompilerResults、Assembly。

一、CSharpCodeProvider
提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码,可以使用VBCodeProvider。
CreateCompiler():获取编译器的实例。
二、ICodeCompiler
定义用于调用源代码编译的接口或使用指定编译器的CodeDOM树。每种编译方法都接受指示编译器的CompilerParameters对象,并返回指示编译结果的CompilerResults对象。
CompilerAssemblyFromSource(CompilerParameters option, string source):使用指定的编译器,从包含源代码的字符串设置编译程序集。
三、CompilerParameters
表示用于调用编译器的参数。
ReferencedAssemblies:获取当前项目所引用的程序集。Add方法为程序集添加引用。
GenerateExecutable:获取或设置一个值,该值指示是否生成可执行文件。若此属性为false,则生成DLL,默认是false。
GenerateInMemory:获取或设置一个值,该值指示是否在内存中生成输出。
四、CompilerResults
表示从编译器返回的编译结果。
CompiledAssembly:获取或设置以编译的程序集,Assembly类型。
五、Assembly
程序集。

大致了解了以上知识之后,就可以使用C#动态的编译并执行代码了,一下是一段示例程序:

  1. using System;  
  2. using System.Reflection;  
  3. using System.Globalization;  
  4. using Microsoft.CSharp; 
  5. using System.CodeDom;  
  6. using System.CodeDom.Compiler; 
  7. using System.Text;  
  8.  
  9. namespace ConsoleApplication1  
  10.     public class Program 
  11.     { 
  12.         static void Main(string[] args) 
  13.         { 
  14.             // 1.CSharpCodePrivoder 
  15.             CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider(); 
  16.  
  17.             // 2.ICodeComplier 
  18.             ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler(); 
  19.  
  20.             // 3.CompilerParameters 
  21.             CompilerParameters objCompilerParameters = new CompilerParameters(); 
  22.             objCompilerParameters.ReferencedAssemblies.Add("System.dll"); 
  23.             objCompilerParameters.GenerateExecutable = false
  24.             objCompilerParameters.GenerateInMemory = true
  25.  
  26.             // 4.CompilerResults 
  27.             CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode()); 
  28.  
  29.             if (cr.Errors.HasErrors) 
  30.             { 
  31.                 Console.WriteLine("编译错误:"); 
  32.                 foreach (CompilerError err in cr.Errors) 
  33.                 { 
  34.                     Console.WriteLine(err.ErrorText); 
  35.                 } 
  36.             } 
  37.             else 
  38.             { 
  39.                 // 通过反射,调用HelloWorld的实例 
  40.                 Assembly objAssembly = cr.CompiledAssembly; 
  41.                 object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld"); 
  42.                 MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut"); 
  43.  
  44.                 Console.WriteLine(objMI.Invoke(objHelloWorld, null)); 
  45.             } 
  46.  
  47.             Console.ReadLine(); 
  48.         } 
  49.  
  50.         static string GenerateCode() 
  51.         { 
  52.             StringBuilder sb = new StringBuilder(); 
  53.             sb.Append("using System;"); 
  54.             sb.Append(Environment.NewLine); 
  55.             sb.Append("namespace DynamicCodeGenerate"); 
  56.             sb.Append(Environment.NewLine); 
  57.             sb.Append("{"); 
  58.             sb.Append(Environment.NewLine); 
  59.             sb.Append("    public class HelloWorld"); 
  60.             sb.Append(Environment.NewLine); 
  61.             sb.Append("    {"); 
  62.             sb.Append(Environment.NewLine); 
  63.             sb.Append("        public string OutPut()"); 
  64.             sb.Append(Environment.NewLine); 
  65.             sb.Append("        {"); 
  66.             sb.Append(Environment.NewLine); 
  67.             sb.Append("             return \"Hello world!\";"); 
  68.             sb.Append(Environment.NewLine); 
  69.             sb.Append("        }"); 
  70.             sb.Append(Environment.NewLine); 
  71.             sb.Append("    }"); 
  72.             sb.Append(Environment.NewLine); 
  73.             sb.Append("}"); 
  74.  
  75.             string code = sb.ToString(); 
  76.             Console.WriteLine(code); 
  77.             Console.WriteLine(); 
  78.  
  79.             return code; 
  80.         } 
  81.     } 

 

被阅474次, 0投一票

安徽舞台

2010-07-09 14:44:43
还是先连个链接吧!
  • 看完了要说点啥么?
  • 昵称 (不填说不了话)
  • 信箱地址 (不会被公开,但是不填也说不了话)
  • 网址 (这个不填也成)

Powered by MiniBoke v2.0.0.8 Build 0828

Copyright © 2008 迷你博客. All rights reserved.

粤ICP备07500939号