C#高级应用之CodeDomProvider引擎篇 .
using System;
using System.Text;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.CSharp;
namespace ToolPackages.CodeDomProvider
{
?public class SampleCodeDomProvider
?{
??//代碼生成器對(duì)象
??private static System.CodeDom.Compiler.CodeDomProvider comp = new? CSharpCodeProvider();
??//編譯器參數(shù)
??private static CompilerParameters cp = new CompilerParameters();
??private object curObj;
??public bool Compile(string codes)
??{
???StringBuilder codeBuilder = new StringBuilder();
???//完成待編譯的代碼構(gòu)建工作,可移動(dòng)到調(diào)用層構(gòu)建
???codeBuilder.Append("using System;");
???codeBuilder.Append("using Microsoft.JScript;");
???codeBuilder.Append("public class Sharpnessdotnet{");
???codeBuilder.Append(codes);
???codeBuilder.Append("}");
???//完成編譯器參數(shù)的初始化
???//1.引用的程序集
???cp.ReferencedAssemblies.Add("System.dll");
???cp.ReferencedAssemblies.Add("Microsoft.JScript.dll");
???//2.僅在內(nèi)存中生成
???cp.GenerateExecutable = false;
???cp.GenerateInMemory = true;
???
???string code = codeBuilder.ToString();
???//利用編譯器參數(shù)設(shè)置和構(gòu)建的代碼進(jìn)行編譯工作
???CompilerResults cr = comp.CreateCompiler().CompileAssemblyFromSource(cp, code);
???//判斷是否編譯成功
???if (cr.Errors.HasErrors)
???{
????return false;
???}
???else
???{
????//獲取編譯成功的程序集
????Assembly a = cr.CompiledAssembly;
????//從程序集中獲取指定類型
????System.Type type = a.GetType("Sharpnessdotnet");
????//調(diào)用其默認(rèn)構(gòu)造函數(shù),返回一個(gè)實(shí)例
????curObj = type.GetConstructor(new Type[0]).Invoke(null);
????return true;
???}
??}
??//調(diào)用指定成員
??public object InvokeMember(string member,System.Reflection.BindingFlags flags,params object[] parameters)
??{
???if(curObj!=null)
???{
????return? curObj.GetType().InvokeMember(member,flags,null,curObj,parameters);
???}
???else
???{
????throw new Exception("please compile first.");
???}
??}
?}
}
//調(diào)用實(shí)例部分?
?
using System;
using System.IO;
using System.Collections;
using System.Text;
using System.Data;
using ToolPackages.CodeDomProvider;
namespace ToolPackages
{
?class Application
?{
??/// <summary>
??/// 應(yīng)用程序的主入口點(diǎn)。
??/// </summary>
??[STAThread]
??static void Main(string[] args)
??{
???SampleCodeDomProvider myCoder = new SampleCodeDomProvider();
???StringBuilder codes = new StringBuilder();
???codes.Append("public void sayHello()");
???codes.Append("{");
???codes.Append("Console.WriteLine(/"hello world.../");");???
???codes.Append("}");
???codes.Append("public static void saySomething(string message)");
???codes.Append("{");
???codes.Append("Console.WriteLine(message);");???
???codes.Append("}");
???myCoder.Compile(codes.ToString());
???myCoder.InvokeMember("sayHello",System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod,null);
???myCoder.InvokeMember("saySomething",System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.InvokeMethod,new object[]{"my name is sharpnessdotnet,i love system analyse."});
???Console.Read();???
??}??
??
??
?}
?
}
總結(jié)
以上是生活随笔為你收集整理的C#高级应用之CodeDomProvider引擎篇 .的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。