如何用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