using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.CSharp; // 用于编译C#源代码
using System.Reflection;
using System.CodeDom.Compiler;
namespace WindowsFormsApplication5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
CodeCompiler.Compile(new string[] { }, textBox1.Text,"");
listBox1.Items.Clear();
foreach (string s in CodeCompiler.ErrorMessage) {
listBox1.Items.Add(s);
}
listBox1.Items.Add(CodeCompiler.Message);
}
//动态代码
//using System;
//class MyClass
//{
// public string GetResult()
// {
// int a,b;
// a=3;b=5;a+=b;
// return a.ToString();
// }
//}
static class CodeCompiler
{
static public string Message;
static public List<string> ErrorMessage = new List<string>();
public static bool Compile(string[] references, string source, string outputfile)
{
// 编译参数
CompilerParameters param = new CompilerParameters(references, outputfile, true);
param.TreatWarningsAsErrors = false;
param.GenerateExecutable = false;
param.IncludeDebugInformation = true;
// 编译
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerResults result = provider.CompileAssemblyFromSource(param, new string[] { source });
Message = "";
ErrorMessage.Clear();
if (!result.Errors.HasErrors)
{ // 反射调用
Type t = result.CompiledAssembly.GetType("MyClass");
if (t != null)
{
object o = result.CompiledAssembly.CreateInstance("MyClass");
Message = (string)t.InvokeMember("GetResult", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, o, null);
}
return true;
}
foreach (CompilerError error in result.Errors)
{ // 列出编译错误
if (error.IsWarning) continue;
ErrorMessage.Add("Error(" + error.ErrorNumber + ") - " + error.ErrorText + "\t\tLine:" + error.Line.ToString() + " Column:"+error.Column.ToString());
}
return false;
}
}
}
}