c# 动态编译代码

  1 using System;  
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.CodeDom.Compiler;
6 using Microsoft.CSharp;
7 using System.Web;
8 using System.Reflection;
9 namespace VSOnline.Framework
10 {
11 /// <summary>
12 /// 代码执行类
13 /// </summary>
14 public class CodeRun
15 {
16 /// <summary>
17 /// Framework版本,可选择v2.0, v3.0, v3.5
18 /// </summary>
19 private string CompilerVersion { get; set; }
20 /// <summary>
21 /// 构造函数
22 /// </summary>
23 /// <param name="compilerVersion">Framework版本,可选择v2.0, v3.0, v3.5</param>
24 public CodeRun(string compilerVersion)
25 {
26 CompilerVersion = compilerVersion;
27 }
28 /// <summary>
29 /// 构造函数,默认为3.5版本
30 /// </summary>
31 public CodeRun()
32 {
33 CompilerVersion = "v3.5";
34 }
35 /// <summary>
36 /// 动态编译并执行代码
37 /// </summary>
38 /// <param name="code">代码</param>
39 /// <returns>返回输出内容</returns>
40 public List<string> Run(string code, string id)
41 {
42 Consoler.Outputs.Add(id, new Consoler());
43 CompilerParameters compilerParams = new CompilerParameters();
44 //编译器选项设置
45 compilerParams.CompilerOptions = "/target:library /optimize";
46 //compilerParams.CompilerOptions += @" /lib:""C:/Program Files/Reference Assemblies/Microsoft/Framework/v3.5/""";
47 //编译时在内存输出
48 compilerParams.GenerateInMemory = true;
49 //生成调试信息
50 compilerParams.IncludeDebugInformation = false;
51 //添加相关的引用
52 //foreach (string assembly in assemblies)
53 //{
54 // compilerParams.ReferencedAssemblies.Add(assembly);
55 //}
56 //compilerParams.ReferencedAssemblies.Add("mscorlib.dll");
57 //compilerParams.ReferencedAssemblies.Add("System.dll");
58 //if (this.CompilerVersion == "v3.5")
59 //{
60 // compilerParams.ReferencedAssemblies.Add("System.Core.dll");
61 //}
62 compilerParams.ReferencedAssemblies.Add("mscorlib.dll");
63 compilerParams.ReferencedAssemblies.Add("System.dll");
64 //compilerParams.ReferencedAssemblies.Add("System.Core.dll");
65 string path = "";
66 try
67 {
68 //System.Web.HttpContext.Current.Request.PhysicalApplicationPath + ("/Bin/WebSet.xml");
69 path = HttpContext.Current.Request.PhysicalApplicationPath +("/Bin/");
70
71 }
72 catch { }
73 compilerParams.ReferencedAssemblies.Add(path + "VSOnline.Framework.dll");
74 CSharpCodeProvider compiler = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", CompilerVersion } });
75 //编译
76 code = code.Replace("Console.WriteLine", string.Format("VSOnline.Framework.Consoler.Outputs[/"{0}/"].WriteLine", id));
77 code = code.Replace("Console.Write", string.Format("VSOnline.Framework.Consoler.Outputs[/"{0}/"].Write", id));
78 CompilerResults results = compiler.CompileAssemblyFromSource(compilerParams, code);
79 //错误
80 if (results.Errors.HasErrors)
81 {
82 foreach (CompilerError error in results.Errors)
83 {
84 Consoler.Outputs[id].Output.Add(error.ErrorText + "/n");
85 }
86 return ReturnOutput(id);
87 }
88 //创建程序集
89 Assembly asm = results.CompiledAssembly;
90 //获取编译后的类型
91 object mainClass = asm.CreateInstance("Program");
92 Type mainClassType = mainClass.GetType();
93 //输出结果
94 mainClassType.GetMethod("Main").Invoke(mainClass, null);
95 return ReturnOutput(id);
96 }
97 private List<string> ReturnOutput(string id)
98 {
99 string[] output = new string[Consoler.Outputs[id].Output.Count];
100 Consoler.Outputs[id].Output.CopyTo(output, 0);
101 Consoler.Outputs.Remove(id);
102 return output.ToList();
103 }
104 }
105 }
 1 public class BLProgram  
2 {
3 protected const string PROCESS_METHOD_CODE = "using System; public class Program{{ public static void Main(){{ string parameter = /"{0}/"; string result = /"{1}/"; Detection(parameter,result); }} static void Detection(string testParameters,string testResults){{ 《》 }} ?? }}";
4
5 /// <summary>
6 /// 判断程序题是否正确
7 /// </summary>
8 /// <param name="strCode"></param>
9 /// <returns></returns>
10 public bool IsCProgramRight(string strCode)
11 {
12 string id = Guid.NewGuid().ToString();
13 List<string> output = new CodeRun().Run(strCode, id);
14 string strOutpt = "";
15 for (int i = 0; i < output.Count; i++)
16 {
17 strOutpt += output[i];
18 }
19 return (strOutpt == "对/n");
20 }
21 /// <summary>
22 /// 输出执行结果
23 /// </summary>
24 /// <param name="strCode"></param>
25 /// <returns></returns>
26 public string GetOutPut(string strCode)
27 {
28 string id = Guid.NewGuid().ToString();
29 List<string> output = new CodeRun().Run(strCode, id);
30 string strOutpt = "";
31 for (int i = 0; i < output.Count; i++)
32 {
33 strOutpt += output[i];
34 }
35 return strOutpt;
36 }
37 /// <summary>
38 /// 生成程序
39 /// </summary>
40 /// <param name="parameter"></param>
41 /// <param name="result"></param>
42 /// <returns></returns>
43 public string GetProgramStyle(string parameter, string result)
44 {
45 StringBuilder processMethod = new StringBuilder();
46 processMethod.AppendFormat(PROCESS_METHOD_CODE, parameter, result);
47 return processMethod.ToString();
48 }
49 /// <summary>
50 /// 判断程序是否能生成成功
51 /// </summary>
52 /// <param name="strCode"></param>
53 /// <returns></returns>
54 public bool BianYI(string strCode)
55 {
56 string id = Guid.NewGuid().ToString();
57 List<string> output = new CodeRun().Run(strCode, id);
58 string strOutpt = "";
59 for (int i = 0; i < output.Count; i++)
60 {
61 strOutpt += output[i];
62 }
63 return (strOutpt == "对/n" || strOutpt == "错/n");
64 }
65 }




转载于:https://www.cnblogs.com/meicnet/archive/2012/02/13/2348910.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值