声明:以前找(InvokeMember))动态调用实例的时候,找了这样一个实例。对文章的标题很是不解,
后来查了相关资料,可以证实,这不是一个反射发送的例子,而是一个动态调用的例子,只是用到了
动态联编技术而以,与实际的反射发送,是完全不同的两个概念。
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
namespace InvokeMember
{
///
/// Class1 的摘要说明。
///
class Class1 { ///
/// 应用程序的主入口点。
///
[STAThread]
static void Main( string [] args)
{
// 循环次数
const int iterations = 100 ;
// 计算所用时间
DateTime startTime = DateTime.Now;
for ( int i = 0 ;i < iterations;i ++ ) { // 对照方法
Console.WriteLine( " Hello,World " );
}
TimeSpan elasped = DateTime.Now - startTime;
Console.WriteLine( " Looping Elapsed milliseconds: " + elasped.TotalMilliseconds + " for {0} iterations " ,iterations);
// 使用反射发送
ReflectionTest t = new ReflectionTest();
// 计算所用时间
startTime = DateTime.Now;
for ( int i = 0 ;i < iterations;i ++ )
{
t.DoOperation();
}
elasped = DateTime.Now - startTime;
Console.WriteLine( " Looping Elapsed milliseconds: " + elasped.TotalMilliseconds + " for {0} iterations " ,iterations);
Console.ReadLine();
}
}
///
/// Reflection 的摘要说明。
///
public class ReflectionTest
{
// 保存动态生成并编译的类的type对象
Type theType = null ;
// 保存动态生成类的实例
object theClass = null ;
///
/// 供Client调用的方法
///
public void DoOperation()
{
// 未初始化
if (theType == null )
{
// 初始化
GenerateCode();
}
// 调用方法时的参数数组(此处为空)
object [] arguments = new object [ 0 ];
// 调用动态生成类的方法
theType.InvokeMember( " SayHello " , // 要调用的方法名
BindingFlags.Default | BindingFlags.InvokeMethod, // Binding标志,具体参看msdn
null , // 使用默认Binding对象
theClass, // 在theClass实例上调用此方法
arguments // 调用方法时的参数数组
);
}
///
/// 运行时生成代码
///
private void GenerateCode()
{
// 文件名
string fileName = " Test " ;
// 打开文件,如果不存在,则创建
Stream s = File.Open(fileName + " .cs " ,FileMode.Create);
// 创建一个StreamWriter来写入数据
StreamWriter wrtr = new StreamWriter(s);
// 写入动态创建类的源代码
wrtr.WriteLine( " // 动态创建Test类 " );
// 类名
string className = " TestClass " ;
wrtr.WriteLine( " using System; " );
wrtr.WriteLine( " class {0} " ,className);
wrtr.WriteLine( " { " );
wrtr.WriteLine( " /tpublic void SayHello() " );
wrtr.WriteLine( " /t{ " );
wrtr.WriteLine( " /t/tConsole.WriteLine(/"Hello,World/"); " );
wrtr.WriteLine( " /t} " );
wrtr.WriteLine( " } " );
// 关闭StreamWriter和文件
wrtr.Close();
s.Close();
// 启动进程编译源文件
// 指定参数
ProcessStartInfo psi = new ProcessStartInfo();
// 启动cmd.exe
psi.FileName = " cmd.exe " ;
// cmd.exe的参数,/c-close,完成后关闭;后为参数,指定cmd.exe使用csc来编译刚才生成的源文件
string compileString = " /c C://WINNT//Microsoft.NET//Framework//v1.1.4322//csc.exe /optimize+ /target:library {0}.cs " ;
psi.Arguments = String.Format(compileString,fileName);
// 运行时的风格-最小化
psi.WindowStyle = ProcessWindowStyle.Minimized;
// 启动进程
Process proc = Process.Start(psi);
// 指定当前在此进程退出前等待
proc.WaitForExit();
// 从编译好的dll文件load一个Assembly
Assembly a = Assembly.LoadFrom(fileName + " .dll " );
// 创建类的实例
theClass = a.CreateInstance(className);
// 取得此类实例的类型
theType = a.GetType(className);
// 删除源文件
// File.Delete(flieName + ".cs");
}
}
}