编译器如何生成事件处理程序代码?
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# 代码中调用处理程序?