读书人

lt;gt; 急 关于C#动态执行代码.

发布时间: 2011-12-27 22:22:54 作者: rapoo

<高手请进> 急! 关于C#动态执行代码...
using System.Text;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;

namespace TestControls
{
public class ExecuteCSharp
{
public static void Eval()
{
//CSharpCodeProvider provider = new CSharpCodeProvider();
//ICodeCompiler compiler = provider.CreateCompiler();
CodeDomProvider compiler = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();

StringBuilder codeBuilder = new StringBuilder();

codeBuilder.AppendLine( "using System; ");
codeBuilder.AppendLine( "using System.Text; ");
codeBuilder.AppendLine( "using System.Windows.Forms; ");
codeBuilder.AppendLine( "using System.Collections.Generic; ");
codeBuilder.AppendLine();
codeBuilder.AppendLine( "namespace TestControls ");
codeBuilder.AppendLine( "{ ");
codeBuilder.AppendLine( " public class Test ");
codeBuilder.AppendLine( " { ");
codeBuilder.AppendLine( " public void Exec() ");
codeBuilder.AppendLine( " { ");
codeBuilder.AppendLine( " MessageBox.Show(\ "测试ing...\ "); ");
codeBuilder.AppendLine( " } ");
codeBuilder.AppendLine( " } ");


codeBuilder.AppendLine( "} ");

cp.GenerateExecutable = false;
cp.GenerateInMemory = true;

CompilerResults cr = compiler.CompileAssemblyFromSource(cp, codeBuilder.ToString());

if (!cr.Errors.HasErrors) //注意、注意:此处通过不了
{
Assembly a = cr.CompiledAssembly;
Type t = a.GetType( "Test ");
MethodInfo mi = t.GetMethod( "Exec ", BindingFlags.Static | BindingFlags.Public);
mi.Invoke(null, new object[0]);
}
}
}
}


using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace TestControls
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
ExecuteCSharp.Eval();
}
}
}


为什么我调用不了[动态代码]里的Test(类) -> Exec方法呢?

动态编译根本通过不了,是不是我用的方法错了,请高手指示...


[解决办法]
CodeDomProvider compiler = new CSharpCodeProvider();
String[] referenceAssemblies = { "System.dll ", "System.Windows.Forms.dll " };

CompilerParameters cp = new CompilerParameters(referenceAssemblies);

StringBuilder codeBuilder = new StringBuilder();

codeBuilder.AppendLine( "using System; ");
codeBuilder.AppendLine( "using System.Text; ");
codeBuilder.AppendLine( "using System.Windows.Forms; ");
codeBuilder.AppendLine( "using System.Collections.Generic; ");
codeBuilder.AppendLine( " public class Test ");


codeBuilder.AppendLine( " { ");
codeBuilder.AppendLine( " public static void Exec() ");
codeBuilder.AppendLine( " { ");
codeBuilder.AppendLine( " MessageBox.Show(\ "testing...\ "); ");
codeBuilder.AppendLine( " } ");
codeBuilder.AppendLine( " } ");

cp.GenerateExecutable = false;
cp.GenerateInMemory = true;

CompilerResults cr = compiler.CompileAssemblyFromSource(cp, codeBuilder.ToString());

if (!cr.Errors.HasErrors)
{
Assembly a = cr.CompiledAssembly;
Type t = a.GetType( "Test ");
t.InvokeMember( "Exec ", BindingFlags.Public |
BindingFlags.Static | BindingFlags.InvokeMethod,
System.Type.DefaultBinder, null, null);
}
[解决办法]
// 载入其他库

private void button1_Click(object sender, EventArgs e)
{
ICodeCompiler vCodeCompiler = new CSharpCodeProvider().CreateCompiler();
CompilerParameters vCompilerParameters = new CompilerParameters();
vCompilerParameters.GenerateExecutable = false;
vCompilerParameters.GenerateInMemory = true;
vCompilerParameters.ReferencedAssemblies.Add( "System.Windows.Forms.dll "); // 关键语句
string vSource =
"using System.Windows.Forms;\n " +
"public class Temp\n " +
"{\n " +
" public void Test()\n " +
" {\n " +
" MessageBox.Show(\ "Hello World!\ ");\n " +
" }\n " +
"}\n ";
CompilerResults vCompilerResults =
vCodeCompiler.CompileAssemblyFromSource(vCompilerParameters, vSource);

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

读书人网 >C#

热点推荐