首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

<> 急 关于C#动态执行代码.

2011-12-27 
高手请进 急! 关于C#动态执行代码...usingSystem.TextusingMicrosoft.CSharpusingSystem.CodeDom.Comp

<高手请进> 急! 关于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);
}

热点排行