主机项和主机控件是类型,可帮助为使用 Visual Studio 中的 Office 开发工具创建的 Office 解决方案提供编程模型。 主机项和主机控件让与基于 COM 的 Microsoft Office Word 和 Microsoft Office Excel 对象模型的交互,变得更像与托管对象(例如 Windows 窗体控件)的交互。
适用于: 本主题中的信息适用于 Excel 和 Word 的文档级项目和 VSTO 外接程序项目。 有关详细信息,请参阅 Office 应用程序和项目类型提供的功能。
主机项
宿主项是 Office 项目中对象模型层次结构顶部的类型。 Visual Studio Tools for Office 运行时为 Word 和 Excel 解决方案定义了以下主机项:
- 
每种类型都扩展了 Word 或 Excel 对象模型中本机存在的对象,这些对象被称为 本机 Office 对象。 例如,Document 宿主项扩展了 Document 对象,该对象是在 Word 的主互操作程序集里定义的。 主机项通常与相应的 Office 对象具有相同的基本功能,但具有以下功能增强: 
- 托管控件的功能,包括宿主控件和 Windows 窗体控件。 
- 更丰富的事件模型。 本地 Word 和 Excel 对象模型中的某些文档、工作簿和工作表事件仅在应用程序级别触发。 宿主项在文档级别提供这些事件,以便更轻松地处理特定文档的事件。 
了解文档级项目中的宿主项
在文档级项目中,主机项目提供代码的入口点,并且它们配备有助于开发解决方案的设计器。
和Document和Worksheet宿主项具有关联的设计器,这些设计器是文档或工作表的可视化表示形式,如同 Windows 窗体设计器。 可以使用此设计器直接在 Word 或 Excel 中修改文档或工作表的内容,并将控件拖到设计图面上。 有关详细信息,请参阅 文档宿主项 和 工作表宿主项。
主机 Workbook 项不充当具有用户界面的控件的容器。 相反,此主机项的设计器充当组件托盘,使你可以将组件(如 a DataSet)拖到其设计图面上。 有关详细信息,请参阅 工作簿托管项。
无法在文档级项目中以编程方式创建宿主项。 请改用 Visual Studio 在设计时在项目中自动生成的ThisDocumentThisWorkbook或 Sheetn 个类。 这些生成的类派生自宿主项,并为您的代码提供了入口点。 有关详细信息,请参阅 主机项和主机控件的编程限制。
了解 VSTO 外接程序项目中的宿主项
创建 VSTO 外接程序时,默认情况下无权访问任何主机项。 但是,您可以在运行时在 Word 和 Excel VSTO 外接程序中生成 Document、Workbook 和 Worksheet 托管项。
生成宿主项后,可以执行诸如向文档添加控件等任务。 有关详细信息,请参阅 运行时在 VSTO 外接程序中扩展 Word 文档和 Excel 工作簿。
主机控件
主机控件扩展 Word 和 Excel 对象模型中的各种用户界面(UI)对象,例如 Microsoft.Office.Interop.Word.ContentControl 和 Range 对象。
以下主机控件可用于 Excel 项目:
- 
以下主机控件可用于 Word 项目: 
- 
添加到 Office 文档的主机控件的行为类似于本机 Office 对象;但是,主机控件具有其他功能,包括事件和数据绑定功能。 例如,如果要在 Excel 中捕获原生 Range 对象的事件,首先必须处理工作表的更改事件。 然后,必须确定更改是否发生在Range中。 相比之下, NamedRange 主机控件具有 Change 可以直接处理的事件。 主机项和主机控件之间的关系类似于 Windows 窗体和 Windows 窗体控件之间的关系。 就像在 Windows 窗体上放置文本框控件一样,您将控件NamedRange 放置在宿主项Worksheet 上。 下图显示了主机项和主机控件之间的关系。   可以通过将 Windows 窗体控件直接添加到 Word 和 Excel 文档表面,来在 Office 解决方案中使用这些控件。 有关详细信息,请参阅 Office 文档中的 Windows Forms 控件概述。 
注释
不支持将主机控件或 Windows 窗体控件添加到 Word 子文档。
向文档添加主机控件
在文档级项目中,你可以通过以下方式在设计时向 Word 文档或 Excel 工作表添加宿主控件:
- 在设计时向文档添加宿主控件的方式与添加本机对象的方式相同。 
- 将主机控件从 工具箱 拖到文档和工作表上。 Excel 主机控件在 Excel 项目中的 “Excel 控件 ”选项卡中可用,Word 项目中的 “Word 控件 ”选项卡中提供 Word 主机控件。 
- 将主机控件从 “数据源 ”窗口拖到文档和工作表上。 这使你可以添加已绑定到数据的控件。 有关详细信息,请参阅 将数据绑定到 Office 解决方案中的控件。 - 在文档级和 VSTO 外接程序项目中,还可以在运行时向文档添加一些主机控件。 有关详细信息,请参阅 运行时向 Office 文档添加控件。 - 有关如何向文档添加主机控件的详细信息,请参阅以下主题: 
主机名称控件
将主机控件从 工具箱 拖动到文档中时,控件会自动使用末尾带有增量数字的控件类型进行命名。 例如,书签命名为 bookmark1、 bookmark2 等。 如果使用 Word 或 Excel 的本机功能添加控件,则可以在创建控件时为其指定一个特定名称。 还可以通过在“属性”窗口中更改 Name 属性的值来重命名控件。
注释
不能使用保留字来命名主机控件。 例如,如果将控件添加到 NamedRange 工作表并将名称更改为 “系统”,则生成项目时会发生错误。
删除主机控件
在文档级项目中,可以通过选择 Excel 工作表或 Word 文档上的控件并按 Delete 键,在设计时删除宿主控件。 但是,必须使用 Excel 中的“ 定义名称 ”对话框删除 NamedRange 控件。
如果在设计时向文档添加主机控件,则不应在运行时以编程方式删除它,因为在下次尝试在代码中使用控件时,将引发异常。 主机 Delete 控件的方法仅删除在运行时添加到文档的主机控件。 如果调用 Delete 在设计时创建的主机控件的方法,则会引发异常。
例如,只有当NamedRange是通过编程方式添加到工作表中的,NamedRange的Delete方法才能成功删除它,这就是所谓的动态创建宿主控件。 还可以通过将控件名称传递给Controls或Controls属性的Remove方法来删除动态创建的主机控件。 有关详细信息,请参阅 运行时向 Office 文档添加控件。
如果最终用户在运行时从文档中删除主机控件,解决方案可能会以意外的方式失败。 可以使用 Word 和 Excel 中的文档保护功能来保护主机控件不被删除。 有关详细信息,请参阅 Office 开发示例和演练。
注释
请勿在文档或工作表的Shutdown事件处理程序期间以编程方式删除控件。 事件发生时,Shutdown UI 元素不再可用。 如果要在应用程序关闭前删除控件,请将代码添加到另一个事件处理程序,例如 BeforeClose 或 BeforeSave。
针对主机控制事件的程序
主机控件扩展 Office 对象的一种方法是添加事件。 例如, Range Excel 中的对象和 Bookmark Word 中的对象没有事件,但 Visual Studio Tools for Office 运行时通过添加可编程事件来扩展这些对象。 可以通过访问 Windows 窗体上的控件事件的方式访问和编码这些事件:通过 Visual Basic 中的事件下拉列表和 C# 中的事件属性页。 有关详细信息,请参阅 操作指南:针对 NamedRange 控件事件的编程。
注释
不应将 EnableEvents Excel 中对象的属性 Application 设置为 false。 将此属性设置为 false 可防止 Excel 引发任何事件,包括主机控件的事件。