动态编译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, null, new 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, null, new 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();
}
}
}
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, null, new 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, null, new 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();
}
}
}