使用 Visual Studio Tools for Office 可以创建两种类型的解决方案:文档级自定义项和应用程序级外接程序。它们具有以下配置:
-
文档级自定义项由附加于 Microsoft Office Word 文档或 Microsoft Office Excel 工作簿的托管代码程序集组成。
-
应用程序级外接程序由作为 Microsoft Office 应用程序中的外接程序运行的托管代码程序集组成。
使用Visual Studio Tools for Office 开发的应用程序是基于CLR的托管应用程序,而Office 是基于COM 组件的非托管应用程序.所以在此觉得有必要复习一下托管应用程序在CLR中的执行过程.就举一个最简单的例子吧,代码如下:
下图为执行的流程图
简单说说执行过程,VS.NET IDE 调用CSC.exe编译器生成EXE程序集.以32位操作系统为例.当执行EXE程序集时,首行创建一个32位的进程,这个进程中的主线程会去调用MSCorEE.dll组件来初始化CLR,MSCorEE.dll位于C:\WINDOWS\system32目录下,用来判断一台机器是否安装.NET Framework.初如化的CLR会去加载EXE程序集,并从函数入口点Main()开始执行程序,CLR为Main方法中调用的Console类型分配一个单独的内部结构,并为每个该类型的每个方法付上地址,以便该方法调用的时候使用,当首次调用WriteLine()方法时,会去调用JIT编译器,JIT编译器从元数据中查找WriteLine方法,把它编译成本地的CPU代码.并修改存储在Console类型中WriteLine的指针,这样子第二次开始调用WriteLine方法可直接执行本地的CPU代码.另外对元数据有点补充,元数据有二张表,一张是类型表,如用来核对编译时的参数类型.另一个是成员表.说明该托管模块有哪些成员.托管应用程序的执行过程就介绍到这边,下面介绍一下Office应用程序的执行过程.
VSTO创建的两种解决方案,不管是文档级自定义项,还是应用程序级外接程序,部署后都是由office文档和程序集(dll文件)两个部份组成.当打开具体托管代码office文档时,VSTO加载程序将启动VSTO 运行库(Runtime),创建应用程序域并将该应用程序域的策略设置为不信任“我的电脑”区域.接着VSTO 运行库初始化公共语言运行库(CLR)到应用程序域中.被初始化的CLR加载与文档对应的托管程序集.托管程序通过主互操作程序集PIA(适配器)来捕获文档中发生的事件.接下去具体谈谈Office文档调用程序集的过程.
1.文档级自定义项的体系结构
1).2007 Microsoft Office system 的自定义项体系结构
不管是文档级自定义项,还是应用程序级外接程序,都存在着指针,用来保存关链的托管程序集的地址.在Office2007文档提供了_AssemblyLocation 属性,用来存储部署清单.当用户打开属于 2007 Microsoft Office 自定义项的文档时,应用程序从 _AssemblyLocation读取部署清单.接着从部署清单中读取应用程序清单.来查找最新的文档级自定义项程序集.自定项程序集过主互操作程序集PIA与Office COM组件进行通信.
2).Microsoft Office 2003 的自定义项体系结构
在Office2003文档级自义定项中,不同的是用运行时存储控件来保存应用程序清单.当用户打开属于 2003 Microsoft Office 自定义项的文档时,应用程序从运行时存储控件中读取应用程序清单.应用程序清单加载可选的部署清单来查找最新的文档级自义定项程序集.自定项程序集过主互操作程序集PIA与Office COM组件进行通信.
在此有必要说说VSTO Runtime 3.0和VSTO Runtime 2.0加载组件是不同的.在VSTO Runtime 3.0,应用程序首先加载VSTOEE.dll组件,接着加载VSTOLoader.dll组件来初始化公共语言运行库.而在VSTO Runtime 2.0只提供AddinLoader.dll来初始化公共语言运行库.
2.应用程序级外接程序的体系结构
1).2007 Microsoft Office system 的外接程序体系结构
与文档级自定义项程序相比,应用程序外接程序是通过注册来发现应用程序的.当用户打开属于 2007 Microsoft Office 应用程序外接程序文档时.应用程序读取注册表项,接着读取部署清单.从部署清单中读取应用程序清单来查找最新的外接程序程序集.外接程序程序集通过主互操作程序集(PIA)与Office COM组件通信.
2).Microsoft Office 2003 的外接程序体系结构
与Microsoft Office 2007 的外接程序相比.加载外接程序程序集的过程基本上是一样的.有一点不同的是应用程序清单加载可选择的部署清单来查找最新的外接程序程序集,外接程序程序集通过主互操作程序集(PIA)与Office COM组件通信.