该系列文章转载自    http://bbs.51cto.com/thread-1017338-1.html

参考资料 http://www.excelpx.com/thread-184209-1-1.html

1 主互操作程序集(PIA)的介绍
Office应用程序如Word,Excel和Outlook都是用非托管代码来写的, 而我们创建的VSTO工程使用的是托管代码,这时候就需要使用互操作程序集来与Office应用程序里的非托管COM对象交互,然后主互操作程序集(PIA)指的是官方发布的互操作程序集,如果电脑中安装了PIA,当你添加对类库的引用时,那么Visual Studio会自动加载PIA,微软为Office应用程序提供了PIA,如EXcel PIA就是Microsof.Office.Interop.Excel.dll,其他应用程序也类似。当安装了Office产品后,PIA会自动安装在电脑的GAC目录里,每当创建一个VSTO解决方案, Visual Studio会自动为该解决方案加载合适的Office PIA引用和其他程序集,具体PIA目录见下图:
vsto之一简介(系列文章为转载)-LMLPHP
如果安装完Office产品后没有安装相应的PIA到GAC,可以执行Office的安装程序进行修复。

2. 宿主项和宿主控件的介绍
宿主项是表示Office对象模型入口点的。应用程序外接程序使用Microsoft.Office.Tools.AddIn类为宿主项,此宿主项提供对宿主应用程序和成员的对象模型的访问,可以通过宿主项添加数据绑定的能力和提供额外的事件来扩展本地Office文档。而创建一个Excel解决方案会创建4个Excel宿主项:Workbook,Sheet1,Sheet2和Sheet3,如下图:
vsto之一简介(系列文章为转载)-LMLPHP
宿主项是Word和Excel等设计界面,担当控件容器的作用,就像VBA里把控件添加到UserForm上一样,我们可以把Windows Form 控件和宿主控件添加到宿主项上,值得注意的是Workbook宿主项,它不作为宿主控件的容器,在工作簿宿主项中不能添加控件只能包含组件。
宿主项控件了Office的对象模型,它是基于本机Office对象的,本机Office对象使用的是Microsoft.Office.Interop.Word命名控件下定义的类型而宿主项和宿主控件定义在Microsoft.Office.Tools.Word(Excel)等命名控件下的。宿主控件与本机对象的功能类似,但是宿主控件扩展了本机对象,添加了数据绑定和事件等功能

3 创建VSTO项目
对于刚接触VSTO的朋友来说,可能根本就不知道如何去创建一个VSTO的项目的,相信通过这个部分大家就会觉得是如此的简单。
环境的搭建
进行VSTO开发的环境搭建是相当简单的,只需要安装Visual Studio 2010(当然安装VS2010的时候在安装组件中必须勾选VSTO选择,这个选项是默认勾上的。大家可以在安装VS的时候留意下)和Office 2010就可以,当然VS2008 和Office 2007的安装也可以完成环境的搭建。
创建第一个Excel工程来开始我们的VSTO之旅
第一步, 选择新建项目->Visual C#->Office->2010,然后选择Excel 2010外接程序(如何是英文版即Excel 2010 Add-in),如下图:
vsto之一简介(系列文章为转载)-LMLPHP
  从图中可以看到,除了外接程序外,还有Excel模板和Excel文档这两种项目类型,他们的区别是 外接程序是应用程序级别的,即如果你创建了Excel 2010外接程序,该程序对所有Excel应用都是有效的,因为每次Excel的启动过程都会加载该插件(即该程序),大家肯定留意到当我们启动Excel或Word的时候都会加载一些加载项,其实这些加载项就是属于外接程序,即插件,启动过程见下面图:
vsto之一简介(系列文章为转载)-LMLPHP
  而 文档和模板项目,都是属于文档级别的程序,该程序只对当前文档和模板有效,创建这两种类型的项目,会在项目的工程目录下会生成一个word文件(文档项目会生成一个 Document1.docx文件,模板项目会生成一个Document1.dotx文件)。
创建成功之后,外接程序的项目文件结构见下图:
vsto之一简介(系列文章为转载)-LMLPHP
  从图中可以看出,刚创建的VSTO外接程序都只有一个ThisAddIn.cs文件,该文件即是一个宿主项(更多关于宿主项和宿主控件的内容可以查看该系列的第一篇博文),我们可以通过这个文件来对Excel对象进行访问。同时该类中有ThisAddIn_Startup和ThisAddIn_Shutdown两个方法,从两个方法中命名中可以知道,如果你的代码想在加载外接程序时运行的话,就放把代码放在ThisAddIn_Startup方法内容,如果你想在外接程序卸载的时候运行你的代码,就把这些代码放在ThisAddIn_Shutdown方法内。

05-11 13:23