怎么动态执行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#