Outlook PIA 中的事件
浏览 Outlook 主互操作程序集 (PIA),您可能会注意到,许多接口和事件委托都根据 Outlook 对象模型中熟悉的对象和事件名称来命名。 与 COM 类型库中的事件不同,Outlook PIA 中的事件并不是与同一对象的方法和属性在同一接口中定义的。 导入或创建与事件相关的接口、委托和接收器帮助程序类,以支持 Outlook PIA 中的事件。 本主题将介绍这些与事件相关的接口、委托和接收器帮助程序类。
事件接口、委托和接收器帮助程序类的来源
为了创建 Outlook PIA,Outlook 将使用 .NET Framework 中的类型库导入程序 (TLBIMP) 将 COM 类型库中的类型定义转换为公共语言运行库 (CLR) 程序集中的等效定义。 TLBIMP 会为每个对象导入以下两种类型的接口:
主接口(例如,_Application 接口)
事件接口(例如,ApplicationEvents_11 接口)
TLBIMP 将处理导入的接口并创建许多接口、委托和类,包括 .NET 接口(例如,Application 接口)。 如果该对象还有事件,则创建以下内容:
.NET 事件接口(例如,ApplicationEvents_11_Event 接口)
每个事件的委托(例如,ApplicationEvents_11_ItemSendEventHandler 委托)
接收器帮助程序类(例如,ApplicationEvents_11_SinkHelper 类)
事件的多个版本
有些在 Outlook 的多个版本中存在的对象在各版本中有不同的事件实现,并且随着新版本的发布添加了其他事件。 为了支持在多个版本中不同的事件,Outlook 会向其名称中添加版本号,以区分这些与事件相关的接口、委托和类。 例如:
Application 对象的导入事件接口包括:
用于 Outlook 98 和 Outlook 2000 的最早期版本:ApplicationEvents 接口
用于 Outlook 2002 的版本:ApplicationEvents_10 接口
用于 Outlook 2003 及以后发行版的版本:ApplicationEvents_11 接口
TLBIMP 为 Application 对象创建的 .NET 事件接口包括:
用于 Outlook 98 和 Outlook 2000 的最早期版本:ApplicationEvents_Event 接口
用于 Outlook 2002 的版本:ApplicationEvents_10_Event 接口
用于 Outlook 2003 及以后发行版的版本:ApplicationEvents_11_Event 接口
TLBIMP 为 Application 对象的每个版本中的每个事件创建的委托,例如,用于 ItemSend 事件的每个版本的委托:
用于 Outlook 98 和 Outlook 2000 的最早期版本:ApplicationEvents_ItemSendEventHandler 委托
用于 Outlook 2002 的版本:ApplicationEvents_10_ItemSendEventHandler 委托
用于 Outlook 2003 及以后发行版的版本:ApplicationEvents_11_ItemSendEventHandler 委托
从逻辑上讲,添加到较高版本中的事件不会出现在早期版本的事件接口中,在早期版本中也没有对应的委托。 例如,AttachmentSelectionChange 事件被添加到了 Outlook 2010 中的 Explorer 对象,因此,该事件不属于 Explorer 对象的早期事件接口的一部分:
ExplorerEvents 接口
ExplorerEvents_Event接口
另一方面,可以在最新的 .NET 事件接口(ExplorerEvents_10_Event)及其 Outlook 2010 版本的委托 (ExplorerEvents_10_AttachmentSelectionChangeEventHandler)中找到该事件。
事件接口、委托和接收器帮助程序类的用途
本节将以 Application 对象为例,介绍上述各个接口和类所包含的内容:
主接口 _Application 用于定义 Application 的所有方法和属性。 除了下面讨论的情况外,通常不在代码中使用此接口。
TLBIMP 导入的事件接口(如 ApplicationEvents_11 和 ApplicationEvents_10)用于定义到对应 Outlook 版本中的 Application 事件的方法映射。 不要在代码中使用此接口。
TLBIMP 创建的事件接口(如 ApplicationEvents_11_Event 和 ApplicationEvents_10_Event)用于在对应的 Outlook 版本中定义所有 Application 事件。 在为特定版本中的事件设计事件处理程序时,需要将事件处理程序作为方法来实现,并将该方法连接到在 .NET 事件接口的对应版本中定义的事件。 除了下面讨论的情况外,通常不在代码中引用事件接口。
.NET 接口 Application 继承 _Application 接口和 ApplicationEvents_11_Event 接口。 通常,您在托管代码中使用此接口来访问对象、方法、属性和 Application 对象的最新事件成员。 但是,有两种例外情况,此时将不使用 .NET 接口而使用其他接口来连接事件:
当您访问的事件与该对象的方法共享同一名称时,请转换为相应的事件接口来连接该事件。 例如,若要连接到 Quit 事件,请转换到 ApplicationEvents_11_Event 接口。
当您连接到事件的早期版本,而该事件随后在更高版本的 Outlook 中进行了扩展,请连接到该事件在早期接口中的版本。 例如,如果要连接到为 Outlook 2002 实现的 Application 对象的 Quit 事件的版本,而不是最新版本,请连接到在 ApplicationEvents_10_Event 接口中定义的 Quit 事件,而不是 ApplicationEvents_11_Event 接口的 Quit 事件。
当您在特定的 Outlook 版本中为特定事件创建自定义事件处理程序时,委托可为您提供一个框架。 例如,如果要添加一项检查,以在发送 Outlook 项目之前检查主题行是否存在,应在与委托 ApplicationEvents_11_ItemSendEventHandler 具有相同签名的回调方法中实现该检查。 然后,将回调方法挂接为在 ApplicationEvents_11_Event 接口中定义的 ItemSend 事件的事件处理程序。 有关将回调方法作为对象的事件处理程序来连接的详细信息,请参阅连接到自定义事件处理程序。
TLBIMP 创建的接收器帮助程序类(例如,ApplicationEvents_11_SinkHelper和 ApplicationEvents_10_SinkHelper)是相应版本的 Outlook 中应用程序事件的事件帮助程序对象。 请勿在代码中使用这些类。