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

Visual Studio 2013 包括用于为 Microsoft Office Word 和 Microsoft Office Excel 创建文档级自定义的项目。 本主题介绍文档级自定义的以下方面:

了解定制化

使用 Visual Studio 中的 Office 开发人员工具生成文档级自定义项时,将创建与特定文档关联的托管代码程序集。 具有链接程序集的文档或工作簿被称为具有托管代码扩展。 有关详细信息,请参阅 “设计和创建 Office 解决方案”。

当用户打开文档时,Microsoft Office 应用程序加载程序集。 加载程序集后,定制化功能可以在文档打开时响应事件。 自定义项还可以调用对象模型,以在文档打开时自动执行和扩展应用程序,并且可以使用 .NET Framework 中的任何类。

该程序集通过应用程序的主互作程序集与应用程序的 COM 组件通信。 有关详细信息,请参阅 Office 主互作程序集Office 解决方案开发概述(VSTO)。

如果用户同时打开多个文档级自定义项,则会在不同的应用程序域中加载每个程序集。 这意味着一个行为不正确的解决方案无法导致其他解决方案失败。 文档级自定义项旨在处理单个应用程序域中的单个文档。 它们不用于跨文档通信。 有关应用程序域的详细信息,请参阅 应用程序域

注释

使用 Visual Studio 中的 Office 开发人员工具创建的文档级自定义设置设计为仅在最终用户启动应用程序时才使用。 例如,如果使用自动化以编程方式启动应用程序,则自定义可能无法按预期工作。

设计时和运行时体验

若要了解文档级自定义项的体系结构,它有助于了解设计解决方案和运行解决方案的体验。

设计时间

设计时体验包括以下步骤:

  1. 开发人员在 Visual Studio 中创建文档级项目。 该项目包括文档和在文档后面运行的程序集。 该文档可能已存在(由设计器创建),也可以与项目一起创建新文档。

  2. 设计器(创建项目或其他人)将为最终用户创建文档的最终外观。

运行时

运行时体验包括以下步骤:

  1. 最终用户将打开具有托管代码扩展的文档或工作簿。

  2. 文档或工作簿加载编译的程序集。

  3. 当用户在文档或工作簿中工作时,程序集将响应事件。

比较开发人员和最终用户视角

由于开发人员主要在 Visual Studio 中工作,最终用户在 Word 或 Excel 中工作,因此可通过两种方式了解文档级自定义。

开发人员的观点 最终用户的观点
开发人员使用 Visual Studio 编写可供 Word 和 Excel 访问的代码。

尽管开发人员似乎正在创建一个运行 Word 或 Excel 的可执行文件,但该过程实际上以其他方式工作。 该文档与程序集相关联,并包含指向该程序集的指针。 文档打开时,Word 或 Excel 将找到程序集并运行代码以响应所有已处理的事件。
使用解决方案的用户只需打开文档或工作簿(或从模板创建新文档),就像打开任何其他Microsoft Office 文件一样。

程序集在文档或工作簿中提供自定义,例如自动用当前数据填充文档,或显示对话框请求信息。

文档级自定义所支持的文档格式

创建自定义项目时,可以选择要在项目中使用的文档的格式。 有关详细信息,请参阅 如何:在 Visual Studio 中创建 Office 项目

下表列出了在 Excel 和 Word 的文档级自定义项中使用的文档格式。

Excel 单词
Excel 工作簿(.xlsx

启用宏的 Excel 工作簿 (.xlsm

Excel 二进制工作簿 (.xlsb

Excel 97-2003 工作簿(.xls

Excel 模板 (.xltx

启用宏的 Excel 模板(.xltm

Excel 97-2003 模板 (.xlt
Word 文档(.docx

已启用 Word 宏的文档(.docm

Word 97-2003 文档(.doc

Word 模板 (.dotx

已启用 Word 宏的模板 (.dotm

Word 97-2003 模板(.dot

托管代码扩展应仅设计用于受支持格式的文档。 否则,当文档在应用程序中打开时,可能不会触发某些事件。 例如,当您在保存为 Excel XML 电子表格格式或网页 (.htm; .html) 格式的工作簿中使用托管代码扩展时,不会引发该事件。

支持具有 .xml 文件扩展名的 Word 文档

文档级项目模板不允许基于以下文件格式创建项目:

  • Word XML 文档(*xml)。

  • Word 2003 XML 文档(*xml)。

    如果希望最终用户使用这些文件格式的自定义项,请生成并部署使用上表中指定支持文件格式之一的自定义项。 安装自定义项后,最终用户可以将文档保存为 Word XML 文档(*xml)格式或 Word 2003 XML 文档(*xml)格式,并且自定义项将继续按预期工作。

自定义项的组成部分

自定义的主要组件是文档和程序集。 除了这些组件之外,还有几个其他部分在 Microsoft Office 应用程序发现和加载自定义项方面发挥着重要作用。

部署清单和应用程序清单

自定义项使用部署清单和应用程序清单来标识和加载自定义程序集的最新版本。 部署清单指向当前应用程序清单。 应用程序清单指向自定义程序集,并指定要在程序集中执行的入口点类(或类)。 有关详细信息,请参阅 Office 解决方案中的应用程序和部署清单

Visual Studio 办公室工具运行时

若要运行使用 Visual Studio 中的 Office 开发人员工具创建的文档级自定义,最终用户计算机必须安装 Visual Studio Tools for Office 运行时。 Visual Studio Tools for Office 运行时包括加载自定义程序集的非托管组件,以及一组托管程序集。 这些托管程序集提供了您的自定义代码用于自动化和扩展主机应用程序的对象模型。

有关详细信息,请参阅 Visual Studio Tools for Office 运行时概述

如何在 Microsoft Office 应用程序中实现自定义

当用户打开属于 Microsoft Office 自定义项的文档时,应用程序将使用链接到文档的部署清单来查找和加载自定义程序集的最新版本。 部署清单的位置存储在名为 AssemblyLocation 的自定义文档属性中。 生成解决方案时,标识此位置的字符串将插入到属性中。

部署清单指向应用程序清单,然后指向最新的程序集。 有关详细信息,请参阅 Office 解决方案中的应用程序和部署清单

下图显示了文档级自定义的基本体系结构。

2007 Office 自定义体系结构

注释

在面向 .NET Framework 4 的 Office 解决方案中,解决方案通过使用嵌入在解决方案程序集中的主互作程序集 (PIA) 类型信息(而不是直接调用 PIA)来调用主机应用程序的对象模型。 有关详细信息,请参阅 “设计和创建 Office 解决方案”。

加载过程

当用户打开属于 Microsoft Office 解决方案的文档时,将执行以下步骤。

  1. Microsoft Office 应用程序检查自定义文档属性,以查看是否有与文档关联的托管代码扩展。 有关详细信息,请参阅 自定义文档属性概述

  2. 如果存在托管代码扩展,应用程序将加载 VSTOEE.dll,这会加载 VSTOLoader.dll。 这些是 Visual Studio 2010 Tools for Office 运行时的加载组件的非托管 DLL。 有关详细信息,请参阅 Visual Studio Tools for Office 运行时概述

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

  4. 如果文档是从本地计算机以外的位置打开的,Visual Studio Tools for Office 运行时会验证文档的位置是否位于该特定 Office 应用程序的“信任中心设置”中的“受信任位置”列表中。 如果文档位置不在受信任的位置,则自定义项不受信任,加载过程将在此处停止。

  5. Visual Studio Tools for Office 运行时安装解决方案(如果尚未安装)、下载最新的应用程序和部署清单,并执行一系列安全检查。 有关详细信息,请参阅 安全 Office 解决方案

  6. 如果信任自定义项运行,Visual Studio Tools for Office 运行时将使用部署清单和应用程序清单来检查程序集更新。 如果程序集的新版本可用,运行时会将该程序集的新版本下载到客户端计算机上的 ClickOnce 缓存。 有关详细信息,请参阅 部署 Office 解决方案

  7. Visual Studio Tools for Office 运行时创建一个新的应用程序域,用于加载自定义程序集。

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

  9. Visual Studio Tools for Office 运行时在自定义程序集中调用 启动 事件处理程序。 有关详细信息,请参阅 Office 项目中的事件