C#動態執行代碼

      在開始以前,先熟悉幾個類及部分屬性、方法: CSharpCodeProviderICodeCompilerCompilerParametersCompilerResultsAssembly

   1、CSharpCodeProvider
    提供對C#代碼生成器和代碼編譯器的實例的訪問。若是要動態生成VB代碼,能夠使用 VBCodeProvider

     CreateCompiler():獲取編譯器的實例。

   2、ICodeCompiler
    定義用於調用源代碼編譯的接口或使用指定編譯器的 CodeDOM樹。每種編譯方法都接受指示編譯器的 CompilerParameters對象,並返回指示編譯結果的 CompilerResults對象。

     CompilerAssemblyFromSource(CompilerParameters option, string source):使用指定的編譯器,從包含源代碼的字符串設置編譯程序集。

   3、CompilerParameters
    
表示用於調用編譯器的參數。

     ReferencedAssemblies:獲取當前項目所引用的程序集。 Add方法爲程序集添加引用。
     GenerateExecutable:獲取或設置一個值,該值指示是否生成可執行文件。若此屬性爲false,則生成DLL,默認是false。
     GenerateInMemory:獲取或設置一個值,該值指示是否在內存中生成輸出。

   4、CompilerResults
    表示從編譯器返回的編譯結果。

     CompiledAssembly:獲取或設置以編譯的程序集,Assembly類型。

   5、Assembly
    就是程序集了(不知道如何描述了)。

  大體瞭解了以上知識以後,就能夠使用C#動態的編譯並執行代碼了,一下是一段示例程序:
using System;
using System.Reflection;
using System.Globalization;
using Microsoft.CSharp;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Text;

namespace ConsoleApplication1
{
    
public class Program
      {
        
static void Main( string [] args)
          {
            
// 1.CSharpCodePrivoder
              CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();

            
// 2.ICodeComplier
              ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();

            
// 3.CompilerParameters
              CompilerParameters objCompilerParameters = new CompilerParameters();
              objCompilerParameters.ReferencedAssemblies.Add(
" System.dll " );
              objCompilerParameters.GenerateExecutable
= false ;
              objCompilerParameters.GenerateInMemory
= true ;

            
// 4.CompilerResults
              CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode());

            
if (cr.Errors.HasErrors)
              {
                  Console.WriteLine(
" 編譯錯誤: " );
                
foreach (CompilerError err in cr.Errors)
                  {
                      Console.WriteLine(err.ErrorText);
                  }
              }
            
else
              {
                
// 經過反射,調用HelloWorld的實例
                  Assembly objAssembly = cr.CompiledAssembly;
                
object objHelloWorld = objAssembly.CreateInstance( " DynamicCodeGenerate.HelloWorld " );
                  MethodInfo objMI
= objHelloWorld.GetType().GetMethod( " OutPut " );

                  Console.WriteLine(objMI.Invoke(objHelloWorld,
null ));
              }

              Console.ReadLine();
          }

        
static string GenerateCode()
          {
              StringBuilder sb
= new StringBuilder();
              sb.Append(
" using System; " );
              sb.Append(Environment.NewLine);
              sb.Append(
" namespace DynamicCodeGenerate " );
              sb.Append(Environment.NewLine);
              sb.Append(
" { " );
              sb.Append(Environment.NewLine);
              sb.Append(
"       public class HelloWorld " );
              sb.Append(Environment.NewLine);
              sb.Append(
"       { " );
              sb.Append(Environment.NewLine);
              sb.Append(
"           public string OutPut() " );
              sb.Append(Environment.NewLine);
              sb.Append(
"           { " );
              sb.Append(Environment.NewLine);
              sb.Append(
"                return \ " Hello world ! \ " ; " );
              sb.Append(Environment.NewLine);
              sb.Append(
"           } " );
              sb.Append(Environment.NewLine);
              sb.Append(
"       } " );
              sb.Append(Environment.NewLine);
              sb.Append(
" } " );

            
string code = sb.ToString();
              Console.WriteLine(code);
              Console.WriteLine();

            
return code;
          }
      }
}

 

出處:http://www.cnblogs.com/wenjl520/archive/2008/12/31/1365968.htmlhtml

相關文章
相關標籤/搜索