当前位置:编程学习 > C#/ASP.NET >>

怎么动态执行C#代码

我想要动态的执行一段C#代码,但是这段代码里面包含这个窗体中一个控件的值,请问怎么实现?
源码入下:
private void Compiler(string code)
        {
            CompilerParameters vCompilerParameters = new CompilerParameters();
            vCompilerParameters.GenerateExecutable = false;
            vCompilerParameters.GenerateInMemory = true;
            vCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
            string vSource =
            "using System.Windows.Forms;\n" +
            "\n public class Temp\n" +
            " {\n" +
            "  public void Test()\n" +
            "  {\n" +
            "   " + code + "\n" +
            "  }\n" +
            " }\n";
            MessageBox.Show(vSource);
            CompilerResults vCompilerResults =
            CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(vCompilerParameters, vSource);

            Assembly vAssembly = vCompilerResults.CompiledAssembly;
            object vTemp = vAssembly.CreateInstance("Temp");
            MethodInfo vTest = vTemp.GetType().GetMethod("Test");
            vTest.Invoke(vTemp, null);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Compiler(" MessageBox.Show(\"aa\");");
        }
这样执行是没问题的,但是如果这样调用就不行
private void button1_Click(object sender, EventArgs e)
        {
            Compiler("MessageBox.Show(sys.kjid);");
        }
sys.kjid是我这个工程中的一个静态类

高手们如果知道请帮帮我,先谢谢了 --------------------编程问答-------------------- 帮帮忙 --------------------编程问答-------------------- 高手们帮忙啊 --------------------编程问答-------------------- 真的没人知道怎么处理吗? --------------------编程问答-------------------- --------------------编程问答-------------------- Compiler("MessageBox.Show(\""+ sys.kjid + "\");");
呢 --------------------编程问答-------------------- 更改Compiler方法
Compiler(string code, string kjid)
{
code =code.substring(0,code.length-2)+"\""+kjid+"\");";
...
..
}
private void button1_Click(object sender, EventArgs e)
  {
  Compiler("MessageBox.Show();",sys.kjid);
  } --------------------编程问答-------------------- 进来学习学习 --------------------编程问答-------------------- 5楼的方法是显示常量来的,而不是取值 --------------------编程问答-------------------- 你要动态执行就不能调用当前项目中的任何代码了,也就是说单独的执行一段代码块,和当前的程序没有瓜葛。所以如果你想调用这个,要么就在动态执行的代码中声明,要么就直接取值。当然 我想LZ所想的是前者吧~~[align=center]***********************************************************
                   欢迎使用CSDN 小秘书
***********************************************************[/align] --------------------编程问答-------------------- 楼上请说明下如何操作,谢谢 --------------------编程问答-------------------- 真的没办法吗 --------------------编程问答-------------------- 反射,你可以动态生成代码,把代码写在TextBox文本框里面都可以! --------------------编程问答-------------------- 生成之后也可以动态执行! --------------------编程问答-------------------- 通过委托可以实现 --------------------编程问答-------------------- 请知道怎么处理的朋友给出例子,谢谢 --------------------编程问答-------------------- 唉!!只能帮顶个咯。。。 --------------------编程问答-------------------- 动态加载代码,反射,事件,这是思路。没有具体看你的代码! --------------------编程问答-------------------- --------------------编程问答-------------------- 帮顶!!!!! --------------------编程问答-------------------- --------------------编程问答-------------------- 可以试试先把代码存成一个文件,然后用反射去读取那个类 --------------------编程问答-------------------- 学习一下 --------------------编程问答-------------------- 把值做为参数的形式传进去...
改造
MethodInfo vTest = vTemp.GetType().GetMethod("Test");
  vTest.Invoke(vTemp, null);

GetMethod有重载方法,可以加参数 --------------------编程问答-------------------- 如果你项目中的,你需要添加对你项目dll的引用,添加对应的反射代码。
动态创建代码。然后再反射。。。 --------------------编程问答-------------------- vCompilerParameters.ReferencedAssemblies.Add("你的项目.dll"); --------------------编程问答-------------------- 要想访问sys.kjid在 param.ReferencedAssemblies集合中加上你当前的程序集就可以了
param.ReferencedAssemblies.Add(AppDomain.CurrentDomain.BaseDirectory + "a.exe"); --------------------编程问答--------------------
 #region 执行静态代码
        /// <summary>
        /// 执行代码,返回结果(默认引用了System.dll、System.Data.dll、System.Xml.dll、System.Web.dll 4个程序集)
        /// </summary>
        /// <param name="code">代码</param>
        /// <param name="arrReferencedAssemblies">要引用的程序集</param>
        /// <returns></returns>
        public static object ExecuteCode(string code, string[] arrReferencedAssemblies)
        {
            CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();

            CompilerParameters objCompilerParameters = new CompilerParameters();
            objCompilerParameters.ReferencedAssemblies.Add("System.dll");       //引用dll 
            objCompilerParameters.ReferencedAssemblies.Add("System.Data.dll");  //引用dll 
            objCompilerParameters.ReferencedAssemblies.Add("System.Xml.dll");   //引用dll 
            objCompilerParameters.ReferencedAssemblies.Add("System.Web.dll");   //引用dll 
            if (arrReferencedAssemblies != null)
                foreach (string item in arrReferencedAssemblies)
                    objCompilerParameters.ReferencedAssemblies.Add(item);
            objCompilerParameters.GenerateExecutable = false;
            objCompilerParameters.GenerateInMemory = true;

            CompilerResults cr = (objCSharpCodePrivoder.CompileAssemblyFromSource(objCompilerParameters,
            new [] { GenerateCode(code) }));

            if (cr.Errors.HasErrors)
            {
                StringBuilder l_err = new StringBuilder("编译错误:");
                foreach (CompilerError err in cr.Errors)
                {
                    l_err.AppendLine(err.ErrorText);
                }
                return l_err.ToString();
            }
            // 通过反射,调用HelloWorld的实例 
            Assembly objAssembly = cr.CompiledAssembly;
            object objHelloWorld = objAssembly.CreateInstance("CommonOtherDynamicCodeGenerate.CommonOtherDynamicCodeGenerateClass");
            MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");
            // 调用执行 
            return objMI.Invoke(objHelloWorld, null);
        }

        /// <summary>
        /// 执行代码,返回结果(默认引用了System.dll、System.Data.dll、System.Xml.dll 3个程序集)
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public static object ExecuteCode(string code)
        {
            return ExecuteCode(code, null);
        }

        private static string GenerateCode(string code)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("using System;");
            sb.Append(Environment.NewLine);
            sb.Append("using System.Text;");
            sb.Append(Environment.NewLine);
            sb.Append("using System.IO;");
            sb.Append(Environment.NewLine);
            sb.Append("using System.Data;");
            sb.Append(Environment.NewLine);
            sb.Append("using System.Xml;");
            sb.Append(Environment.NewLine);
            sb.Append("using System.Web;");
            sb.Append(Environment.NewLine);
            sb.Append("using System.Collections;");
            sb.Append(Environment.NewLine);
            sb.Append("using System.Collections.Generic;");
            sb.Append(Environment.NewLine);
            sb.Append("namespace CommonOtherDynamicCodeGenerate");
            sb.Append(Environment.NewLine);
            sb.Append("{");
            sb.Append(Environment.NewLine);
            sb.Append(" public class CommonOtherDynamicCodeGenerateClass");
            sb.Append(Environment.NewLine);
            sb.Append(" {");
            sb.Append(Environment.NewLine);
            sb.Append(" public object OutPut()");
            sb.Append(Environment.NewLine);
            sb.Append(" {");
            sb.Append(Environment.NewLine);
            sb.Append(" return " + code + ";");
            sb.Append(Environment.NewLine);
            sb.Append(" }");
            sb.Append(Environment.NewLine);
            sb.Append(" }");
            sb.Append(Environment.NewLine);
            sb.Append("}");

            return sb.ToString();
        }
        #endregion
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,