События в Outlook PIA
При просмотре основной сборки взаимодействия Outlook (PIA) можно заметить, что многие интерфейсы и делегаты событий названы в соответствии со знакомыми именами объектов и событий в объектной модели Outlook. В отличие от событий в библиотеке типов COM события в Outlook PIA не определены в том же самом интерфейсе как методы и свойства этого же объекта. Связанные с событием интерфейсы, делегаты и классы модуля поддержки приемника либо импортируются, либо создаются для поддержки событий в Outlook PIA. В этом разделе описываются эти связанные с событиями интерфейсы, делегаты и классы модуля поддержки приемника.
Откуда появляются интерфейсы событий, делегаты и классы модуля поддержки приемника
Для создания Outlook PIA в Outlook используется программа импорта библиотек типов (TLBIMP) в среде .NET Framework, позволяющая преобразовывать определения типов в библиотеке типов 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
В число интерфейсов событий .NET, созданных программой TLBIMP для объекта Application, входят:
Самая ранняя версия для 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 было добавлено в объект Explorer в Outlook 2010, следовательно, оно не является частью следующих более ранних интерфейсов события для объекта Explorer:
Интерфейс ExplorerEvents
интерфейс ExplorerEvents_Event
С другой стороны, событие можно найти в последнем интерфейсе события .NET, ExplorerEvents_10_Event, и его делегате для версии Outlook 2010 , ExplorerEvents_10_AttachmentSelectionChangeEventHandler.
Для чего нужны интерфейсы событий, делегаты и классы модуля поддержки приемника
С помощью объекта Application в качестве примера в этом разделе описывается содержание перечисленных выше интерфейсов и классов.
Основной интерфейс, _Application, определяет все методы и свойства Application. За исключением обсуждаемого ниже условия, обычно этот интерфейс в коде не используется.
Интерфейсы событий, импортированные программой TLBIMP, такие как ApplicationEvents_11 и ApplicationEvents_10, определяют сопоставление методов событиям Application в соответствующей версии Outlook. Этот интерфейс не используется в коде.
Интерфейсы событий, созданные программой TLBIMP, такие как ApplicationEvents_11_Event и ApplicationEvents_10_Event, определяют все события Application в соответствующей версии Outlook. Обработчик события, разрабатываемый для конкретной версии, реализуется как метод, который связывается с событием, определенным в соответствующей версии интерфейса событий .NET. За исключением обсуждаемого ниже условия, обычно в коде не ссылаются на интерфейс событий.
Интерфейс .NET, Application, наследуется от интерфейсов _Application и ApplicationEvents_11_Event. Обычно это и есть интерфейс, используемый в управляемом коде для доступа к объектам, методам, свойствам и новейшим членам события объекта Application. Но есть два исключения, в которых для связи с событием используется не интерфейс .NET, а другой интерфейс:
При доступе к событию, носящему то же имя, что и метод этого объекта, для связи с событием обращайтесь к соответствующему интерфейсу события. Например, для связи с событием Quit обращайтесь к интерфейсу ApplicationEvents_11_Event.
При подключении к более ранней версии события, которое затем было расширено в более поздней версии Outlook, подключайтесь к более ранней версии. Например, если нужно подключиться к версии события Quit объекта Application, реализованного для Outlook 2002, а не для самой новой версии, подключитесь к событию Quit , определенному в интерфейсе ApplicationEvents_10_Event, а не к событию Quit, определенному в интерфейсе ApplicationEvents_11_Event.
Делегаты предоставляют платформу для создания настраиваемых обработчиков событий для определенных события в определенной версии Outlook. Например, если вы хотите добавить проверка для существования строки темы в элементе Outlook непосредственно перед отправкой, вы реализуете проверка в методе обратного вызова, который имеет ту же сигнатуру, что и делегат, ApplicationEvents_11_ItemSendEventHandler. Затем вы подключаете метод обратного вызова в качестве обработчика событий для события ItemSend, определенного в интерфейсе ApplicationEvents_11_Event. Дополнительные сведения о подключении метода обратного вызова в качестве обработчика события для объекта см. в статье Подключение к настраиваемым обработчикам событий.
Вспомогательные классы приемников, созданные TLBIMP, например ApplicationEvents_11_SinkHelper и ApplicationEvents_10_SinkHelper, являются вспомогательными объектами событий для событий приложения в соответствующей версии Outlook. Не используйте эти классы в коде.