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();
}
}
}