在asp中,可以用Execute将字符串执行,来计算或者更改变量 
dim TestIf :TestIf=False
Execute("If 1=1 Then TestIf = True Else TestIf = False")然后在后面是TestIf的值是True简单说,就是可以执行脚本过程!请问下,在.NET中有没有办法实现这个功能?

解决方案 »

  1.   

    http://www.systemnetmail.com/faq/4.4.aspx
      

  2.   

    使用CodeDom
    http://msdn.microsoft.com/zh-cn/library/y2k85ax6.aspx
      

  3.   


            static string GenerateCode(string str)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("using System;");
                sb.Append(Environment.NewLine);
                sb.Append("using System.Collections.Generic;");
                sb.Append(Environment.NewLine);
                sb.Append("using System.Linq;");
                sb.Append(Environment.NewLine);
                sb.Append("using System.Web;");
                sb.Append(Environment.NewLine);
                sb.Append("using System.Web.UI;");
                sb.Append(Environment.NewLine);
                sb.Append("using System.Text.RegularExpressions;");
                sb.Append(Environment.NewLine);
                sb.Append("using System.Net;");
                sb.Append(Environment.NewLine);
                sb.Append("using System.IO;");
                sb.Append(Environment.NewLine);
                sb.Append("using System.CodeDom.Compiler;");
                sb.Append(Environment.NewLine);
                sb.Append("using Microsoft.CSharp;");
                sb.Append(Environment.NewLine);
                sb.Append("using System.Reflection;");
                sb.Append(Environment.NewLine);
                sb.Append("using System.Text;");
                sb.Append(Environment.NewLine);
                sb.Append("using System.Data.SqlClient;");
                sb.Append(Environment.NewLine);
                sb.Append("namespace CMS");
                sb.Append(Environment.NewLine);
                sb.Append("{");
                sb.Append(Environment.NewLine);
                sb.Append("      public class DiyCS");
                sb.Append(Environment.NewLine);
                sb.Append("      {");
                sb.Append(Environment.NewLine);
                sb.Append("          public DiyCS() {}");
                sb.Append(Environment.NewLine);
                sb.Append("          public object str;");
                sb.Append(Environment.NewLine);
                sb.Append("          public object OutPut()");
                sb.Append(Environment.NewLine);
                sb.Append("          {");
                sb.Append(Environment.NewLine);
                sb.Append("               str = null;");
                sb.Append(Environment.NewLine);
                sb.Append("               " + str + "");
                sb.Append(Environment.NewLine);
                sb.Append("               return str;");
                sb.Append(Environment.NewLine);
                sb.Append("          }");
                sb.Append(Environment.NewLine);
                sb.Append("      }");
                sb.Append(Environment.NewLine);
                sb.Append("}");
                return sb.ToString();
            }        public static string ParseCode(string str)
            {
                object b = null;            CodeDomProvider p = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
                CompilerParameters cp = new CompilerParameters();
                cp.ReferencedAssemblies.Add("System.dll");
                cp.ReferencedAssemblies.Add("System.Configuration.dll");
                cp.ReferencedAssemblies.Add("System.Core.dll");
                cp.ReferencedAssemblies.Add("System.Data.dll");
                cp.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
                cp.ReferencedAssemblies.Add("System.Data.Entity.dll");
                cp.ReferencedAssemblies.Add("System.Drawing.dll");
                cp.ReferencedAssemblies.Add("System.EnterpriseServices.dll");
                cp.ReferencedAssemblies.Add("System.Runtime.Serialization.dll");
                cp.ReferencedAssemblies.Add("System.Security.dll");
                cp.ReferencedAssemblies.Add("System.Web.dll");
                cp.ReferencedAssemblies.Add("System.Web.Extensions.dll");
                cp.ReferencedAssemblies.Add("System.Web.Mobile.dll");
                cp.ReferencedAssemblies.Add("System.Web.Services.dll");
                cp.ReferencedAssemblies.Add("System.Xml.dll");
                cp.ReferencedAssemblies.Add("System.Xml.Linq.dll");
                cp.GenerateInMemory = true;
                cp.IncludeDebugInformation = false;            CompilerResults cr = p.CompileAssemblyFromSource(cp, GenerateCode(str));            if (cr.Errors.HasErrors)
                {
                    foreach (CompilerError err in cr.Errors)
                    {
                        b = "编译错误:" + err.ErrorText;
                    }
                }
                else
                {                Assembly objAssembly = cr.CompiledAssembly;
                    object objHelloWorld = objAssembly.CreateInstance("CMS.DiyCS");
                    MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");                b = objMI.Invoke(objHelloWorld, null);
                }
                return b.tostr();
            }
    调用方式:string a = ParseCode("if(true){str = 1;}else{str = 0;}");
    输出:a=1
      

  4.   

    现在可以用 Roslyn~ 太特么强大了,有木有。http://www.codeproject.com/Articles/113169/C-As-A-Scripting-Language-In-Your-NET-Applications