应用程序级外接程序的体系结构

更新:2007 年 11 月

适用对象

本主题中的信息仅适用于指定的 Visual Studio Tools for Office 项目和 Microsoft Office 版本。

项目类型

  • 应用程序级项目

Microsoft Office 版本

  • 2007 Microsoft Office system

  • Microsoft Office 2003

有关更多信息,请参见按应用程序和项目类型提供的功能

使用 Visual Studio Tools for Office 创建的外接程序具有强调稳定性和安全性的体系结构功能,这使这些外接程序能够与 Microsoft Office 紧密合作。本主题描述 Visual Studio Tools for Office 外接程序的以下方面:

  • 了解外接程序

  • 外接程序的组件

  • 外接程序如何使用 2007 Microsoft Office system

  • 外接程序如何使用 Microsoft Office 2003

  • Outlook 2003 外接程序的关闭行为

有关使用 Visual Studio Tools for Office 外接程序的常规信息,请参见 Office 解决方案开发概述应用程序级外接程序编程入门

了解外接程序

使用 Visual Studio Tools for Office 生成外接程序时,您将创建一个由 Microsoft Office 应用程序加载的托管代码程序集。加载了程序集之后,外接程序可以响应在应用程序中引发的事件(例如,用户单击菜单项时引发的事件)。外接程序也可以调入对象模型以便实现应用程序自动化和扩展应用程序,并且它可以使用 .NET Framework 中的任何类。

程序集通过应用程序的主互操作程序集与应用程序的 COM 组件通信。有关更多信息,请参见 Office 主互操作程序集Office 解决方案开发概述

Visual Studio Tools for Office 将加载不同应用程序域中的每个外接程序。这意味着一个行为不正确的外接程序不会导致其他外接程序失败。这还可以确保在关闭应用程序时,所有代码都将关闭,并将从内存中卸载程序集。有关应用程序域的更多信息,请参见 应用程序域概述

Bb386298.alert_note(zh-cn,VS.90).gif说明:

对于使用 Visual Studio Tools for Office 创建的外接程序,只在最终用户启动宿主 Microsoft Office 应用程序时使用。如果以编程方式启动应用程序(例如,使用 Automation),则外接程序可能不会按预期方式工作。

外接程序的组件

尽管外接程序程序集是主要组件,但其他一些组件对 Microsoft Office 应用程序如何发现和加载外接程序起着重要作用。

注册表项

Microsoft Office 应用程序通过查找一组注册表项来发现外接程序。Microsoft Office 2003 版和 2007 版的大部分注册表项都相同,但是有一项不同:

  • 2007 Microsoft Office system 中的应用程序在 HKEY_CURRENT_USER\Software\Microsoft\Office\应用程序名称\Addins\外接程序 ID(或者在 Visio 的 HKEY_CURRENT_USER\Software\Microsoft\Visio\Addins\外接程序 ID)项下查找 Manifest 项。Manifest 项指定部署清单的完整路径。

  • Microsoft Office 2003 应用程序在 HKEY_CURRENT_USER\Software\Microsoft\Office\应用程序名称\Addins\外接程序 ID(或者在 Visio 的 HKEY_CURRENT_USER\Software\Microsoft\Visio\Addins\外接程序 ID)项下查找 ManifestName 和 ManifestLocation 项。这些项指定应用程序清单的位置和名称。

生成解决方案时,Visual Studio Tools for Office 会在开发计算机上创建所有必需的注册表项,以便您可以调试和运行外接程序。有关更多信息,请参见 Office 解决方案生成过程概述。 

有关外接程序所使用的注册表项的完整列表,请参见应用程序级外接程序的注册表项

Bb386298.alert_note(zh-cn,VS.90).gif说明:

通过在 HKEY_LOCAL_MACHINE(而非 HKEY_CURRENT_USER)下创建注册表项,可以部署 Microsoft Office 2003 的 Visual Studio Tools for Office 外接程序以使其可供一台计算机的所有用户使用。但是,您无法通过在 HKEY_LOCAL_MACHINE 下注册外接程序从而为一台计算机的所有用户部署 2007 Microsoft Office system 的 Visual Studio Tools for Office 外接程序。2007 Microsoft Office system 中的应用程序仅识别在 HKEY_CURRENT_USER 下注册的 Visual Studio Tools for Office 外接程序。

部署清单和应用程序清单

外接程序使用部署清单和应用程序清单来标识和加载外接程序程序集的最新版本。部署清单指向当前应用程序清单。应用程序清单指向外接程序程序集,并指定要在该程序集中执行入口点类。有关更多信息,请参见 Office 解决方案中的应用程序和部署清单

Visual Studio Tools for Office 运行时

若要运行使用 Visual Studio Tools for Office 创建的外接程序,最终用户计算机必须安装 Visual Studio Tools for Office 运行时。该运行时包括非托管组件和一组托管程序集。非托管组件加载外接程序程序集。托管程序集提供外接程序代码用于实现宿主应用程序自动化和扩展宿主应用程序的对象模型。

有关更多信息,请参见 Visual Studio Tools for Office 运行库概述

外接程序如何使用 2007 Microsoft Office System

用户启动 2007 Microsoft Office system 中的应用程序时,该应用程序将使用部署清单和应用程序清单来定位并加载外接程序程序集的最新版本。下图显示了这些外接程序的基本体系结构。

2007 Microsoft Office system 的外接程序体系结构
2007 Office 外接程序体系结构

加载过程

下面的步骤在用户启动应用程序后进行:

  1. 应用程序检查注册表以查找标识用 Visual Studio Tools for Office 创建的外接程序的项。

  2. 如果应用程序找到这些注册表项,则该应用程序将加载 VSTOEE.dll(它将加载 VSTOLoader.dll)。这些非托管 DLL 是 Microsoft Visual Studio Tools for the Microsoft Office system(3.0 版运行时) 的加载程序组件。有关更多信息,请参见 Visual Studio Tools for Office 运行库概述

  3. VSTOLoader.dll 加载 .NET Framework 并启动 Visual Studio Tools for Office 运行时的托管部分。

  4. Visual Studio Tools for Office 运行时检查清单更新,并下载最新的应用程序和部署清单。

  5. Visual Studio Tools for Office 运行时将执行一系列安全检查。有关更多信息,请参见 Office 解决方案中的安全性 (2007 System)

  6. 如果外接程序受信任可以运行,则 Visual Studio Tools for Office 运行时将使用部署清单和应用程序清单来检查程序集更新。如果有新版本的程序集,则运行时会将新版本的程序集下载到客户端计算机上的 ClickOnce 缓存中。有关更多信息,请参见部署 Office 解决方案 (2007 System)

  7. Visual Studio Tools for Office 运行时将创建一个要在其中加载外接程序程序集的新应用程序域。

  8. Visual Studio Tools for Office 运行时将外接程序程序集加载到应用程序域中。

  9. 如果您已重写 RequestComAddInAutomationService 方法,则 Visual Studio Tools for Office 运行时将在外接程序中调用此方法。

    您可以选择重写此方法以向其他 Microsoft Office 解决方案公开外接程序中的对象。有关更多信息,请参见从其他 Office 解决方案调用应用程序级外接程序中的代码

  10. 如果您已重写 RequestService 方法,则 Visual Studio Tools for Office 运行时将在外接程序中调用此方法。

    您可以选择重写此方法以通过返回一个实现扩展性接口的对象来扩展 2007 Microsoft Office system 中的功能。有关更多信息,请参见使用扩展性接口自定义 UI 功能

  11. Visual Studio Tools for Office 运行时调用外接程序中的 ThisAddIn_Startup 方法。此方法是 Startup 事件的默认事件处理程序。有关更多信息,请参见 Visual Studio Tools for Office 项目事件

Bb386298.alert_note(zh-cn,VS.90).gif说明:

Visual Studio Tools for Office 运行时为宿主应用程序所支持的每个扩展性接口分别调用 RequestService 方法。尽管第一次调用 RequestService 方法通常发生在调用 ThisAddIn_Startup 方法之前,但外接程序不应对何时调用 RequestService 方法或调用多少次做出任何假设。

外接程序如何使用 Microsoft Office 2003

用户启动 Microsoft Office 应用程序时,该应用程序将使用应用程序清单(或者部署清单)中的信息来加载外接程序程序集。下图显示了 Microsoft Office 2003 应用程序的外接程序基本体系结构。

Microsoft Office 2003 的外接程序体系结构
Office 2003 外接程序体系结构

加载过程

下面的步骤在用户启动应用程序后进行:

  1. 应用程序检查注册表以查找标识用 Visual Studio Tools for Office 创建的外接程序的项。

  2. 如果应用程序找到这些注册表项,则该应用程序将加载 VSTOEE.dll(它将加载 AddinLoader.dll)。这些非托管 DLL 是 Visual Studio 2005 Tools for Office Second Edition 运行时的加载程序组件。有关更多信息,请参见 Visual Studio Tools for Office 运行库概述

  3. AddinLoader.dll 加载 .NET Framework 并启动 Visual Studio Tools for Office 运行时的托管部分。

  4. Visual Studio Tools for Office 运行时创建一个新应用程序域,将该应用程序域上的策略设置为不信任“我的电脑区域”,并检查代码访问安全策略存储区以查找外接程序程序集的策略。

  5. .NET Framework 根据应用程序域的策略验证程序集提供的证据。如果验证失败,则引发一个错误。如通过验证,则继续该过程。

  6. 如果外接程序使用部署清单,则 Visual Studio Tools for Office 运行时将使用它来检查程序集更新。如果有必要更新,则立即更新。

  7. Visual Studio Tools for Office 运行时将外接程序程序集加载到新应用程序域中。

  8. 如果您已重写 RequestComAddInAutomationService 方法,则 Visual Studio Tools for Office 运行时将在外接程序中调用此方法。

    您可以选择重写此方法以向其他 Microsoft Office 解决方案公开外接程序中的对象。有关更多信息,请参见从其他 Office 解决方案调用应用程序级外接程序中的代码

  9. Visual Studio Tools for Office 运行时调用外接程序中的 ThisAddIn_Startup 方法。此方法是 Startup 事件的默认事件处理程序。有关更多信息,请参见 Visual Studio Tools for Office 项目事件

Outlook 2003 外接程序的关闭行为

如果要将现有 Outlook 2003 COM 外接程序(即,直接实现 IDTExtensibility2 接口的外接程序)迁移到 Visual Studio Tools for Office,请移除用于解决潜在关闭问题的任何代码。否则,此代码可能会与使用 Visual Studio Tools for Office 创建的 Outlook 2003 外接程序的关闭过程发生冲突,或者也可能过早卸载外接程序。

Bb386298.alert_note(zh-cn,VS.90).gif说明:

本节中描述的行为不适用于 Outlook 2007 外接程序。Outlook 2007 始终调用外接程序中的 OnDisconnection 方法,即使外接程序仍具有对 Outlook 对象的引用。

关闭问题的背景

只要 COM 外接程序具有对一个或多个 Outlook 对象的引用,Outlook 2003 就不会调用该外接程序中的 OnDisconnection 方法。如果外接程序具有只能在 OnDisconnection 方法中清理的对象引用,则 Outlook 2003 在任何情况下都不会调用 OnDisconnection 方法。因此,任何情况下外接程序都不会卸载,Outlook 2003 也不会关闭。

Visual Studio Tools for Office 如何解决关闭问题

使用 Visual Studio Tools for Office 创建的 Outlook 2003 外接程序的卸载方式可避免此潜在问题。如果出现以下任一情况时外接程序不具有对任何 ExplorerInspector 对象的引用,则 Visual Studio Tools for Office 运行时将引发外接程序的 Shutdown 事件并卸载外接程序的应用程序域:

卸载应用程序域时,会清理对其他 Outlook 对象的所有未处理引用,Outlook 2003 随后即可关闭外接程序,然后自行退出。

请参见

概念

文档级自定义项的体系结构

Visual Studio Tools for Office 运行库概述

应用程序级外接程序编程

开发 Office 解决方案

其他资源

Visual Studio Tools for Office 解决方案的结构

Office 解决方案中的安全性

部署 Office 解决方案