C# 动态执行代码(执行string类型代码) (转)

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Collections;
using System.Diagnostics;
using System.IO;

namespace ConsoleApplication
{
    class Program3
    {
        static void Main(string[] args)
        {
            // 定义需要动态执行的 C# 代码字符串,当然也可从文本文件中读取。
            string code = @"
                using System;
                namespace MyNamespace
                {
                    public class MyClass
                    {
                        private string name;

                        public MyClass(string name)
                        {
                            this.name = name;
                        }

                        public void Test()
                        {
                            Console.WriteLine(""{0} - {1}"", name, DateTime.Now);
                        }
                    }
                }
            ";

            // 创建编译器对象
            Microsoft.CSharp.CSharpCodeProvider p = new Microsoft.CSharp.CSharpCodeProvider();
            System.CodeDom.Compiler.ICodeCompiler cc = p.CreateCompiler();

            // 设置编译参数
            System.CodeDom.Compiler.CompilerParameters options = new System.CodeDom.Compiler.CompilerParameters();
            options.ReferencedAssemblies.Add("System.dll");
            options.GenerateInMemory = true;
            options.OutputAssembly = "MyTest";

            // 开始编译
            System.CodeDom.CodeSnippetCompileUnit cu = new System.CodeDom.CodeSnippetCompileUnit(code);
            System.CodeDom.Compiler.CompilerResults cr = cc.CompileAssemblyFromDom(options, cu);

            // 执行动态程序集相关内容。
            Type t = cr.CompiledAssembly.GetType("MyNamespace.MyClass");
            object o = cr.CompiledAssembly.CreateInstance("MyNamespace.MyClass", false, System.Reflection.BindingFlags.Default,
                null, new object[] { "Tomdd" }, System.Globalization.CultureInfo.CurrentCulture, null);
            t.InvokeMember("Test", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod,
                null, o, null);
            Console.ReadKey();

        }
    }
}

转自:http://blog.163.com/kunkun0921@126/blog/static/16920433220126623536526/

posted @ 2015-03-25 14:24  小吴老师  阅读(565)  评论(0编辑  收藏  举报