开发了vsto,客户那边也有一些反映插件安装失败或者加载不上的状况。因而我下定决定再理解下vsto的工做机制,以下图:html
如上图所示,我把vsto的解决方案分为两部分,一部分是vsto Add-ins,另一部分是Microsoft Office Applications。它们之间是如何交互的呢?要回答这个问题,必须对这两部分有必定的认识。首先vsto Add-ins是咱们用c#开发的托管代码,office是基于com产品。微软提供了PIA(程序互操做集),它做为.net调用com的一个接口。它们之间的具体交互图,见我最初写的一篇文章。总之,vsto add-ins经过PIA,调用office的对象模型以及订阅事件:c++
Globals.WordApplication.DocumentChange += new ApplicationEvents4_DocumentChangeEventHandler(WordApplication_DocumentChange); Globals.WordApplication.DocumentOpen += new ApplicationEvents4_DocumentOpenEventHandler(WordApplication_DocumentOpen); Globals.WordApplication.DocumentBeforeClose += new ApplicationEvents4_DocumentBeforeCloseEventHandler(WordApplication_DocumentBeforeClose); (Globals.WordApplication as ApplicationEvents2_Event).Quit += new ApplicationEvents2_QuitEventHandler(() => { Service.StopRemotingService(3); });
所谓office的对象模型,就是操做office的那些对象,下图显示了 Word 对象模型层次结构中这些对象的一个视图。c#
vsto addin是如何加载的?它的执行过程是什么?缓存
对照文章开头的那个图(标出了顺序),咱们来理一理:app
一、office应用程序查看注册表,经过注册表得知vsto部署及应用清单文件。dom
二、office应用程序加载VSTOEE.dll,这是非托管的程序集,它属于vsto runtime的一部分。它的做用是什么呢?为vsto runtime作一些准备工做,好比说,检查runtime的版本等。ui
三、VSTOEE.dll 加载 VSTOLoader.dll,这是vsto runtime的另外一个非托管程序集(实现了com插件的接口,由于咱们知道,实现office加载项,本质上是实现com插件的接口)。它作了两件事情。spa
3.1 加载了vsto runtime中的一些托管程序集。操作系统
3.2 加载了.net framework。.net
四、vsto runtime 建立了一个app domain,加载vsto addin Assembly
通过这4步,office就能够和vsto addin快乐地交互了。
附:日常客户使用过程当中的一些问题,我总结了以下:
一、在反复安装卸载过程当中出现,安装或者卸载均可能出现以下问题,解决办法,安装vc++ 2010,有的状况下能够解决,有的时候解决不掉,不知道why。
二、不知道什么状况下出现的错误,不过极少出现:
解决方法:
三、未将对象引用到实例:
从上图能够看出,追踪到底层,发现framework中的异常。
解决方法,安装.netframework 3.5 sp1 ,这个不必定能解决问题,具体哪出问题了,还不明确,毕竟是极少数的用户有这问题,我初步怀疑是操做系统的问题,由于咱们国家的不少人都用盗版的。
四、已经安装了另外一个版本:
解决方法,这个好解决(与缓存有关系),通常药到病除:
五、操做office时报错:
解决方法:
"D:\Microsoft Office 2003\OFFICE11\EXCEL.EXE" /regserver
六、加载项出现错误:
win10 32bit, office 2007
出现这样的错误,那就得从注册表查起,依据本身对vsto的理解,而后对运行环境等一一排查。
以上是在实际当中常常出现的问题。我作了汇总。出了这些插件安装的问题,其实还有一类问题,是word版本的问题。好比插件在office 2013 的某些低版本下运行,可能会出问题。这时候把对应的升级包打上,问题会迎刃而解。