Office 主互操作程序集(PIA)
在了解如何构建 Office 解决方案之前, 您需要更详细地了解在. NET 中与 Office 对象模型通信的托管程序集. 用于与 Office 通话的托管程序集称为 Office 主互操作程序集(PIA).
如前所述, 当您正在与. NET 中的 Office 对象模型交谈时, 您可以通过称为 COM 互操作的. NET 技术与之交谈. Office 对象模型全部以公开 COM 接口的非托管代码 (C 和 C ++) 编写. 要通过托管代码 (C#或 Visual Basic) 与这些 COM 接口通话, 您可以通过一个包装器进行通话, 允许托管代码与 Office 的非托管 COM 接口进行交互操作. 这个包装器是一组被编译成一个称为主互操作程序集或 PIA 的程序集的. NET 类.
描述这些程序集时使用 "primary" 一词, 因为它们是经 Office 认可的用于与 Office 对象模型通信的包装器. 需要这个指定, 因为您可以使用. NET 提供的工具 (称为 TLBIMP) 为 Office COM 对象模型创建自己的包装器. 您自己创建的包装器称为互操作程序集(IA), 而不是主互操作程序集. 即使您可能会尝试使用 TLBIMP 并构建自己的互操作程序集, 但除了 Office 提供的互操作程序集之外, 您也不应该使用任何其他操作来进行 Office 开发. 如果每个开发人员都为自己的 Office 开发人员创建了自己的套装, 那么没有 Office 解决方案可以与任何人的解决方案进行互操作; 每个 interop 包装类, 例如每个开发人员创建的 Worksheet 将被视为一种不同的类型. 即使我创建的 Interop 程序集有一个 Worksheet 对象, 并且您创建的 Interop 程序集具有一个 Worksheet 对象, 我无法传递我的 Worksheet 对象, 也不能传递给您的 Worksheet 对象. 我们需要使用相同的互操作程序集: 主互操作程序集.
不建立自己的互操作程序集的第二个原因是 Office 已经对 PIA 进行了特殊修复, 以便在执行 Office 开发时使它们更好地工作. 如果您生成自己的, 那么您很可能遇到在 PIA 中修复的问题.
安装 PIA
Office 2003 PIA 可通过 Office 2003 安装程序获得. Office 2003 PIA 也可以作为 Microsoft Windows Installer 包提供, 您可以使用应用程序重新分发. 要通过 Office 2003 安装程序安装 Office 2003 PIA, 进行安装时, 请在 Office 2003 安装向导的第一步中选中 "选择应用程序高级自定义" 复选框. 然后在向导的下一个屏幕中显示的树控件中, 您将在每个应用程序下面看到一个可编程控制器可用的. NET 可编程性支持节点, 如图 1-4 所示. 单击每个这些. NET 可编程支持节点, 并确保您从我的计算机设置运行. 此外, 在树中的 Office 工具节点下, 您可能需要启用 Microsoft Forms 2.0 .NET 可编程支持和智能标记. NET 可编程性支持. 获取 Office 2003 PIA 的第二种方法是完成 Office 2003all 的安装,.NET 可编程性支持将自动打开.
Office PIA 安装到全局程序集缓存(GAC). GAC 通常位于 Windows 目录的 Assembly 子目录中.
有多个 Office PIA 可用. 表 1-4 列出了最常见的一些. 这里列出的一个 PIA 是 Office.dll PIA, 它是在 Office 应用程序 (如 CommandBar) 之间共享的常见类型.
参考 PIAs
添加对 PIA 的引用对于大多数 VSTO 项目是不必要的, 因为引用将自动为您添加. 本书中的控制台应用程序示例, 例如自动化 Excel 的控制台应用程序示例可以键入 Visual Studio 控制台项目并编译, 但必须先添加对必要的 PIA 的引用. 要添加引用, 请在 Visual Studio 解决方案资源管理器中右键单击项目下的 "引用" 文件夹, 如图 1-5 所示. 在右键单击 "引用" 文件夹时, 从弹出的菜单中选择 "添加引用".
选择出现的 "添加引用" 对话框的 COM 选项卡, 如图 1-6 所示. COM 引用按组件名称列出, 与表 1-4 中的描述列匹配. 因此, 要添加对 Excel PIA 的引用, 请选择 Microsoft Excel 11.0 对象库, 然后单击确定按钮将 Excel 2003 PIA 参考添加到项目中, 如图 1-6 所示.
请注意图 1-6 中 "添加引用" 对话框的 "COM" 选项卡中的 "路径" 列显示 PIA 包装的 COM 库的路径. 例如, Microsoft Excel 11.0 Object Library 指向您的计算机上 Excel.EXE 可执行文件的位置. 当您选择这些引用并关闭对话框时, 可以通过扩展项目中的 "引用" 文件夹, 右键单击添加的引用, 然后选择 "属性", 来检查添加的实际引用的属性. 您将看到 Visual Studio 计算出 GAC 中与您选择的 COM 对象相对应的 PIA 托管对象. 在这种情况下, 您将不会获得对 Excel.EXE 可执行文件的引用, 而是 GAC 中的 Microsoft.Office.Interop.Excel.dll.
最后, 请注意, 即使您没有明确添加对 Microsoft Office 11.0 Object Library(Office.dll)的引用, 也为您添加了一个引用. 这是因为 Excel 11.0 Object Library 使用 Microsoft Office 11.0 Object Library 中的类型. Visual Studio 检测到这一点, 并自动将所需的 Office PIA 添加到您的项目引用.
浏览 PIA
当您看到在 Visual Studio 中的对象浏览器中引用的 PIA 时, 您可能会发现自己很困惑. 对象浏览器显示了作为互操作包装器一部分创建的许多辅助对象. 例如, 考虑. NET Interop 对于看似简单的 Excel Application 对象的引用. 它变成一个多关联的头部引用(8 个头标准引用, 36 私自引用). 以下所有以下是在浏览器中与 Excel Application 对象相关的公共类型:
- Interfaces(接口)
- _Application
- AppEvents
- AppEvents_Event
- Application
- IAppEvents
- Delegates(委托)
- AppEvents_*EventHandler (29 of them)
- Classes(类)
- AppEvents_SinkHelper (AppEvents)
- ApplicationClass (_Application, Application, AppEvents_Event)
此图形针对 Chart,OLEObject,QueryTable,Worksheet 和 Workbook.
我们尝试通过从 Excel Application 对象的原始 COM 定义向后工作来解开这个混乱. Application 对象的 COM coclass 看起来像 thisit 有两个接口, 一个称为_Application 的主接口和一个名为 AppEvents 的事件接口. 您可以将 coclass 视为定义 COM 类实现的接口的东西.
- coclass Application {
- [default] interface _Application;
- [default, source] dispinterface AppEvents;
- };
TLBIMP(用于处理 Excel 的 COM 类型库并使用 PIA)直接导入_Application 和 AppEvents 接口, 因此这解释了八种类型中的两种来自哪里. 但是 AppEvents 界面不是很有用, 似乎像某种 TLBIMP 转换的工件. 它必须进一步处理, 以创建后面描述的 AppEvents_Event 的另一个界面.
当 TLBIMP 处理 COM coclass 时, 它将创建一个名为 ApplicationClass 的. NET 类, 它通过获取 coclass 名称并附加 Class 命名. 它还创建一个与名为 Application 的 coclass 同名的. NET 接口. 如果您在浏览器中查看应用程序, 它没有属于自己的属性和方法, 但它来自与 coclass 相关联的其他两个接口:_Application 和 AppEvents_Event.
我们还没有解释 AppEvents_Event 接口来自哪里. 当 TLBIMP 处理 coclass 上的 AppEvents 事件接口时, 它会创建几个帮助类型. 首先, 它创建 AppEvents_Event, 它看起来像 AppEvents, 但事件和委托类型替换 AppEvents 中的方法. 它还创建名为 AppEvents_ * EventHandler 的代理, 其中 * 是原始 AppEvents 界面上每个方法的方法名称. 最后, 它创建一个可以忽略的 AppEvents_SinkHelper.
这只会使 IAppEvents 界面无法解释. TLBIMP 直接导入此接口, 因为它是 Excel 类型库中的公共类型. 你也可以忽略这个. 这实际上是 AppEvents 的重复, 除了 AppEvents 在类型库中声明为 dispinterface, 而 IAppEvents 被声明为双重接口类型.
那么你真的使用哪些? 基本上, 你应该只在代码中使用 Application 接口 (派生自_Application 和 AppEvents_Events) 和代理. 你通常可以假装别人不存在. 此规则的一个例外是当方法和事件名称相冲突, 如本章前面所述. 要在要连接到事件时要调用该方法或 AppEvents_Event 接口的方法和事件之间消除歧义, 则必须将其转换为_Application 接口. 表 1-5 给出了一个总结.
由 TLBIMP 为 coclass 创建的应用程序接口以有趣的方式表现. 您可以在 C#中编写代码, 使其看起来像您正在创建应用程序界面的一个实例, 我们都知道这是不可能的:
Excel.Application myApp = new Excel.Application();
真的, 这是在幕后使用 ApplicationClass 的语法糖 (应用程序界面归因于将其与 ApplicationClass 相关联) 来创建一个 Excel Application 对象并返回相应的接口.
最后, 我们前面提到这个模式对于 Chart,OLEObject,QueryTable,Worksheet 和 Workbook 都是重复的. 图表映射是带 ChartEvents 的图表和 AppEvent 的直接应用程序, 您将得到一般的想法. 工作表有点不同 它的 coclass 看起来像这样:
- coclass Worksheet {
- [default] interface _Worksheet;
- [default, source] dispinterface DocEvents;
- };
所以对于工作表, 使用 Worksheet 替换 Application, 而是将 AppEvents 替换为 DocEventsyielding DocEvents_ * EventHandler 作为 WorkSheet 事件的代理.
QueryTable 甚至是极限. 它的 coclass 看起来像这样:
- coclass QueryTable {
- [default] dispinterface _QueryTable;
- [default, source] dispinterface RefreshEvents;
- };
所以对于 QueryTable, 使用 QueryTable 替换 Application, 并将 AppEvents 替换为 Refresh Event, 从而生成 RefreshMents * EventHandler 作为 QueryTable 事件的委托.
Dummy 方法
当您在 Visual Studio 中的对象浏览器中查看 Excel PIA 时, 您可能会注意到其中包含文本 Dummy 的大量方法. 甚至有一个名为 IDummy 的界面.
不, 这不是 Excel 的侮辱你的智慧的方式. 一切都是虚拟的, 它是一种测试方法, 在 Microsoft 的内部 "调试" 版本中实际上具有合法目的和更具描述性的名称. 例如, Application.Dummy6 在 Excel 的调试版本中称为 Application.DebugMemory. 在 Excel 的零售版本中, 每种方法都重命名为 Dummy. 这些 Dummy 方法中的所有 508 实际上都在调试 Excel 中做了一些事情, 但是在零售版本的 Excel 中, 除了在调用时引发错误, 它们什么都不做.
Excel 将这些标记为 "隐藏", 但 C#对象浏览器默认显示隐藏方法. 当您在 C#对象浏览器中查看 PIA 时, 您将看到这些 Dummy 方法. 如果创建 Visual Basic 项目, Visual Basic 对象浏览器将隐藏具有此属性的方法和属性.
结论
本章介绍了 Office 对象模型, 并研究了对象模型的基本结构. 您学习了如何使用对象, 集合和枚举在任何对象模型中找到的基本类型. 您还学习了如何使用 Office 对象模型中的对象和集合公开的属性, 方法和事件.
本章介绍了将 Office 对象模型暴露给. NET 代码的 Office 主互操作程序集. 您学习了如何在 Visual Studio 项目中使用和引用 Office PIA. 本章还介绍了在对象浏览器中查看 PIA 时可以忽略的内容.
下一章将开始研究 Office 编程中使用的基本开发模式, 并提供各种示例.
来源: http://www.bubuko.com/infodetail-3158780.html