更新MFC中的视图,跟踪.NET Framework中的事件
2006-07-19 11:28:40 来源:WEB开发网// create a new method OnEventXxx
MethodBuilder mthd = helperClass.DefineMethod(...);
// generate its code
ILGenerator il = mthd.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldfld,fld);
il.Emit(OpCodes.Ldstr,ev.Name);
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Ldarg_2);
il.Emit(OpCodes.Callvirt, miReportEvent);
il.Emit(OpCodes.Ret);
对 ILGenerator.Emit 的每一个调用产生一个简单的 MSIL 指令。但是我如何知道哪个指令被生成 了呢?你是否真的认为我知道在 MSIL 中如何编程?当然不是。你不必一定要使用 MSIL 来生成代码。你只要编写拟在 C#中使用的代码(或者任何其它面向.NET的语言) 即可,编译它,并用 ILDASM 来检查生成的 MSIL。这就是我要做的;Figure 5 演示了部分 Figure 4 代码 dump 出的 ILDASM。正如你看到的,MSIL和以前的片断显示的一模一样。
Figure 5 ILDASM Dump
一旦你知道了发现正确的 MSIL 诀窍,剩下的事情就简单了,虽然少不了会有几个 bug:你所犯的任何微不足道的错误归咎于将系统陷入混乱的死亡消息,这些消息根本无法 帮你找定位错误在哪儿。正如我说过的,MSIL 不是给懦弱者的。至少没有人能四平八稳。
EventSpy 相当简单。你不能关闭或打开跟踪,你只能跟踪实例(与静态相反)事件,并且你必须为每个打算跟踪的对象创建一个新的 EventSpy 实例。好了,你对一个自由下载的东西有什么期望? 但当你进行调试时, EventSpy 会完成工作,并且我已经多次成功地使用它查看事件流中所发生的一切。添加更多的特性留给你来做。我主要任务是 抛砖引玉,针对 System.Reflection.Emit 和动态代码生成给出一些建议。Figure 6 总结了在.NET中动态产生代码的不同方法,想获得更多信息请查看相关文档和 Adam J. Steinert 的文章 :“Bring the Power of Templates to Your .NET Applications with the CodeDOM Namespace”。
作者信息
Paul DiLascia 是一个自由撰稿人、顾问和 Web/UI 高级设计师。他是《Windows++: Writing Reusable Windows Code in C++》(Addison-Wesley, 1992)一书的作者。你可以通过http://www.dilascia.com.与他联系。
译者信息
肖进:南京中萃食品有限公司资讯部(210061)
更多精彩
赞助商链接