如何用C#动态编译、执行代码
 在開始之前,先熟悉幾個類及部分屬性、方法: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#動態的編譯并執行代碼了,一下是一段示例程序: 
- 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;
 - ????????}
 - ????}
 - }
 
總結
以上是生活随笔為你收集整理的如何用C#动态编译、执行代码的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 雪里红包子馅怎么做好吃呢?
 - 下一篇: 制作安全网站的checklist