using System;
using System.Text;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.CSharp;
namespace ToolPackages.CodeDomProvider
{
public class SampleCodeDomProvider
{
//代码生成器对象
private static System.CodeDom.Compiler.CodeDomProvider comp = new CSharpCodeProvider();
//编译器参数
private static CompilerParameters cp = new CompilerParameters();
private object curObj;
public bool Compile(string codes)
{
StringBuilder codeBuilder = new StringBuilder();
//完成待编译的代码构建工作,可移动到调用层构建
codeBuilder.Append("using System;");
codeBuilder.Append("using Microsoft.JScript;");
codeBuilder.Append("public class Sharpnessdotnet{");
codeBuilder.Append(codes);
codeBuilder.Append("}");
//完成编译器参数的初始化
//1.引用的程序集
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("Microsoft.JScript.dll");
//2.仅在内存中生成
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;
string code = codeBuilder.ToString();
//利用编译器参数设置和构建的代码进行编译工作
CompilerResults cr = comp.CreateCompiler().CompileAssemblyFromSource(cp, code);
//判断是否编译成功
if (cr.Errors.HasErrors)
{
return false;
}
else
{
//获取编译成功的程序集
Assembly a = cr.CompiledAssembly;
//从程序集中获取指定类型
System.Type type = a.GetType("Sharpnessdotnet");
//调用其默认构造函数,返回一个实例
curObj = type.GetConstructor(new Type[0]).Invoke(null);
return true;
}
}
//调用指定成员
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.");
}
}
}
}
//调用实例部分
using System;
using System.IO;
using System.Collections;
using System.Text;
using System.Data;
using ToolPackages.CodeDomProvider;
namespace ToolPackages
{
class Application
{
/// <summary>
/// 应用程序的主入口点。
/// </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();
}
}
}