分享
 
 
 

反射发送实战(-)InvokeMember

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

反射是.net中的高级功能之一,利用反射可以实现许多以前看来匪夷所思的功能,下面是我看了《Programming C#》(O'Reilly)之后对于反射的一点实践,本想直接做个应用程序来说明问题,但苦于工作繁忙并考虑到以简单为主,故先对反射发送(reflection emit)的使用做一些介绍。文章最后再给出一个实例。

下面的程序在运行时生成了一个Test.cs文件,并调用csc编译成Test.dll文件,然后利用Type.InvokeMember()方法调用其中的SayHello()方法,然后和原始方法对比一下性能。

using System;

using System.Diagnostics;

using System.IO;

using System.Reflection;

namespace InvokeMember

{

/// <summary>

/// Class1 的摘要说明。

/// </summary>

class Class1

{

/// <summary>

/// 应用程序的主入口点。

/// </summary>

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

}

}

/// <summary>

/// Reflection 的摘要说明。

/// </summary>

public class ReflectionTest

{

//保存动态生成并编译的类的type对象

Type theType = null;

//保存动态生成类的实例

object theClass = null;

/// <summary>

/// 供Client调用的方法

/// </summary>

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//调用方法时的参数数组

);

}

/// <summary>

/// 运行时生成代码

/// </summary>

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");

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有