一个简易的C# 代码编译测试工具
TextEditor editor = new TextEditor();
public XtraFormCodeExector()
{
InitializeComponent();
editor.Text= "using System;\r\n"+
"namespace HelloWorld\r\n" +
"{\r\n" +
"\tclass Program\r\n" +
"\t{\r\n" +
"\t\tpublic static void Main()\r\n" +
"\t\t{\r\n" +
"\t\t\tConsole.WriteLine(\"aa\");\r\n" +
"\t\t}\r\n" +
"\t}\r\n" +
"}\r\n";
//展示行号
editor.ShowLineNumbers = true;
editor.Padding = new System.Windows.Thickness(20);
//字体
editor.FontFamily = new System.Windows.Media.FontFamily("Console");
editor.FontSize = 14;
//C#语法高亮
editor.SyntaxHighlighting = HighlightingManager.Instance.GetDefinition("C#");
//将editor作为elemetnHost的组件
elementHost1.Child = editor;
System.Console.SetOut(new TextBoxWriter(textBoxOutPut));
}
private void simpleButtonExec_Click(object sender, EventArgs e)
{
// 编译器
CodeDomProvider cdp = CodeDomProvider.CreateProvider("C#");
// 编译器的参数
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("System.Data.dll");
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;
//编译结果
CompilerResults cr = cdp.CompileAssemblyFromSource(cp, HelloWorld(editor.Text));
if (cr.Errors.HasErrors)
{
foreach (CompilerError item in cr.Errors)
{
string strInfo = string.Format("{0} {1}({2}:{3}):{4}", item.IsWarning ? "警告" : "错误", item.ErrorNumber, item.Line, item.Column, item.ErrorText);
Console.WriteLine(strInfo);
}
}
else
{
// 编译后的程序集
Assembly ass = cr.CompiledAssembly;
// 得到HelloWorld类中的Program方法
Type type = ass.GetType("HelloWorld.Program");
MethodInfo mi = type.GetMethod("Main");
// 执行
mi.Invoke(null, null);
}
// 动态构建的代码
static string HelloWorld(string str)
{
StringBuilder sbCode = new StringBuilder();
sbCode.Append(str);
return sbCode.ToString();
}
}
效果如下:

本博客是个人工作中记录,更深层次的问题可以提供有偿技术支持。
另外建了几个QQ技术群:
2、全栈技术群:616945527
2、硬件嵌入式开发: 75764412
3、Go语言交流群:9924600
闲置域名WWW.EXAI.CN (超级人工智能)出售。
另外建了几个QQ技术群:
2、全栈技术群:616945527
2、硬件嵌入式开发: 75764412
3、Go语言交流群:9924600
闲置域名WWW.EXAI.CN (超级人工智能)出售。

浙公网安备 33010602011771号