编译器如何生成事件处理程序代码?

Posted

技术标签:

【中文标题】编译器如何生成事件处理程序代码?【英文标题】:How does the Compiler generate the Event handler code? 【发布时间】:2009-08-29 11:17:27 【问题描述】:

我在用户控件中添加了一个事件,我在用户控件的消费者窗口中调用了该事件,

我的问题是:当我们通过 IDE 分配事件处理程序时,编译器会生成什么代码?

这样我也可以使用类似的东西在运行时自动编写事件处理程序。

我知道我们可以编写一个事件处理程序,例如我在这里编写的事件处理程序:

SearchControl.SearchChangedEvent += new RoutedEventHandler(SearchControl_SearchChanged);

在这种情况下抛出的错误是没有重载匹配,所以我尝试做编译器通过代码做的同样的事情。编译器如何自动知道参数?

编辑:解决方案。

我在这篇文章中找到了我感到困惑的关注领域:http://msdn.microsoft.com/hi-in/magazine/cc785480%28en-us%29.aspx

“路由事件概述”部分,作者写道:

要查看此内容,请转到构造函数 您的班级,右键单击 InitializeComponent 方法调用,以及 从 上下文菜单。编辑器将显示一个 生成的代码文件(带有命名 .i.g.cs 或 .i.g.vb 的约定) 包含通常的代码 在编译时生成。

我发现后面的代码生成了!!

#line 6 "..\..\Window1.xaml"
this.myButton.Click += 
  new System.Windows.RoutedEventHandler(
  this.myButton_Click);

感谢那些对问题陈述有点困惑的人。我希望这现在说清楚了(就像我在找到解决方案之前无法解释问题一样:)

【问题讨论】:

【参考方案1】:

您在将SearchControl_SearchChanged 函数作为参数传递给委托RoutedEventHandler 的第二次完整描述了它。从MSDN,委托接受两个参数,一个object和一个RoutedEventArgs,并返回void。这就是 IDE 用来自动为您构建 SearchControl_SearchChanged 函数头的东西。

【讨论】:

谢谢 Blindy,,,我现在知道编译器做了什么......有没有办法查看编译生成的类文件(如果有)?好像看过类似的东西,不过想不起来了…… 如果你的意思是 ildasm.exe,它在你的C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin 文件夹中,你运行它,选择你编译的二进制文件,它会为你反汇编它。很抱歉,如果这不是您要的,您的问题有点不清楚。 感谢 Blindy 的帮助......一旦我遇到它,我一定会告诉你答案.. 嗨 Blindy,我终于找到了我要找的东西,仅供参考,我正在寻找像 SomeFormName.designer.cs 这样的东西,你可以在窗口窗体中找到它,我想可能有在 wpf 中也有类似的东西,我猜 baml 在这里也有类似的东西,但当然它是二进制的 :( ,并且有些情况下我已经看到仅通过使用函数名称来调用 routedevents 的地方,我想知道这是怎么发生的 :-)

以上是关于编译器如何生成事件处理程序代码?的主要内容,如果未能解决你的问题,请参考以下文章

编译原理

一个编译生成的可执行程序是用啥命令执行

程序编译流程

如何从 C++ 代码引发事件并在另一个进程的 C# 代码中调用处理程序?

java代码如何生成可运行的程序 例如c一样,编译后有exe java是否一定要jdk??

程序的机器表示: