动态编译C#代码并反射执行

using System;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Text;

namespace ConsoleApplication2
{
    
class Program
    {
        
static void Main(string[] args)
        {

            Program p 
= new Program();
            
if (p.CompileCode())
            {
                
//反射动态编译的程序集DLL
                string dllPathName = AppDomain.CurrentDomain.BaseDirectory + @"MyTestClassLibrary.dll";
                Assembly assembly 
= Assembly.LoadFile(dllPathName);
                
object o = assembly.CreateInstance("MyTestClassLibrary.ClassEntity");

                
//反射类的属性并将属性值输出
                FieldInfo[] fieldInfos = o.GetType().GetFields();
                Console.WriteLine(fieldInfos[
0].GetValue(o));
                Console.WriteLine(fieldInfos[
1].GetValue(o));

                
//反射类 该类所有方法
                MethodInfo[] methodInfos = o.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
                
foreach (MethodInfo info in methodInfos)
                {
                    Console.WriteLine(info.Name);
                }

                
//反射调用有重载方法的
                
//1 调用私有的无参重载方法
                MethodInfo methodInfo1 = o.GetType().GetMethod("HelloWorld", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, nullnew Type[] { }, null);
                
object returnObj1 = methodInfo1.Invoke(o, null);
                Console.WriteLine(returnObj1.ToString());

                
//2 调用私有的有参重载方法
                MethodInfo methodInfo2 = o.GetType().GetMethod("HelloWorld", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, nullnew Type[] { typeof(string) }, null);
                
object returnObj2 = methodInfo2.Invoke(o, new object[] { "\tTest" });
                Console.WriteLine(returnObj2.ToString());
            }
            Console.Read();
        }

        
public bool CompileCode()
        { 
            
//动态将代码生成程序集
            CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
            CompilerParameters parameters 
= new CompilerParameters();
            parameters.GenerateExecutable 
= false;
            parameters.GenerateInMemory 
= false;
            parameters.OutputAssembly 
= AppDomain.CurrentDomain.BaseDirectory + @"MyTestClassLibrary.dll";
            CompilerResults compileResults 
= provider.CompileAssemblyFromSource(parameters, GenerateCode());
            
if (compileResults.Errors.Count > 0)
            {
                Console.WriteLine(
"编译有错误:{0}", compileResults.Errors[0].ErrorText);
                
return false;
            }
            
else
                
return true;

        }

        
private string GenerateCode()
        {
            StringBuilder sb 
= new StringBuilder(2048);
            sb.Append(
"using System;\r\n");
            sb.Append(
"namespace MyTestClassLibrary\r\n");
            sb.Append(
"{\r\n");
            sb.Append(
"    public class ClassEntity\r\n");
            sb.Append(
"    {\r\n");
            sb.Append(
"        public const string TestProperty1 = \"1234567890\";\r\n");
            sb.Append(
"        public const string TestProperty2 = \"0987654321\";\r\n");
            sb.Append(
"        private string HelloWorld(string userName)\r\n");
            sb.Append(
"        {\r\n");
            sb.Append(
"            return DateTime.Now.ToString() + \"\t Hello\"+userName;\r\n");
            sb.Append(
"        }\r\n");
            sb.Append(
"        private string HelloWorld()\r\n");
            sb.Append(
"        {\r\n");
            sb.Append(
"            return DateTime.Now.ToString() + \"\t Hello\";\r\n");
            sb.Append(
"        }\r\n");
            sb.Append(
"    }\r\n");
            sb.Append(
"}\r\n");

            
return sb.ToString();
        }
    }
}
posted @ 2011-03-27 15:00  MrNobody_123456  阅读(331)  评论(0编辑  收藏  举报