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; } } } }