开发了vsto,客户那边也有一些反映插件安装失败或者加载不上的情况。于是我下定决定再理解下vsto的工作机制,如下图:

   如上图所示,我把vsto的解决方案分为两部分,一部分是vsto Add-ins,另外一部分是Microsoft  Office  Applications。它们之间是如何交互的呢?要回答这个问题,必须对这两部分有一定的认识。首先vsto Add-ins是我们用c#开发的托管代码,office是基于com产品。微软提供了PIA(程序互操作集),它作为.net调用com的一个接口。它们之间的具体交互图,见我最初写的一篇文章。总之,vsto add-ins通过PIA,调用office的对象模型以及订阅事件:

  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(); });

所谓office的对象模型,就是操作office的那些对象,下图显示了 Word 对象模型层次结构中这些对象的一个视图。

    

vsto addin是如何加载的?它的执行过程是什么?

对照文章开头的那个图(标出了顺序),我们来理一理:

1、office应用程序查看注册表,通过注册表得知vsto部署及应用清单文件。

2、office应用程序加载VSTOEE.dll,这是非托管的程序集,它属于vsto runtime的一部分。它的作用是什么呢?为vsto runtime做一些准备工作,比如说,检查runtime的版本等。

3、VSTOEE.dll 加载 VSTOLoader.dll,这是vsto runtime的另一个非托管程序集(实现了com插件的接口,因为我们知道,实现office加载项,本质上是实现com插件的接口)。它做了两件事情。

3.1 加载了vsto runtime中的一些托管程序集。

3.2 加载了.net framework。

4、vsto runtime 创建了一个app domain,加载vsto addin Assembly

经过这4步,office就可以和vsto addin快乐地交互了。

附:平常客户使用过程中的一些问题,我总结了如下:

1、在反复安装卸载过程中出现,安装或者卸载都可能出现如下问题,解决办法,安装vc++ 2010,有的情况下可以解决,有的时候解决不掉,不知道why。

2、不知道什么情况下出现的错误,不过极少出现:

解决方法:

3、未将对象引用到实例:

从上图可以看出,追踪到底层,发现framework中的异常。

解决方法,安装.netframework 3.5 sp1 ,这个不一定能解决问题,具体哪出问题了,还不明确,毕竟是极少数的用户有这问题,我初步怀疑是操作系统的问题,因为我们国家的很多人都用盗版的。

4、已经安装了另一个版本:

解决方法,这个好解决(与缓存有关系),一般药到病除:

5、操作office时报错:

解决方法:

"D:\Microsoft Office 2003\OFFICE11\EXCEL.EXE"  /regserver

6、加载项出现错误:

win10 32bit,  office 2007

出现这样的错误,那就得从注册表查起,依据自己对vsto的理解,然后对运行环境等一一排查。

以上是在实际当中经常出现的问题。我做了汇总。出了这些插件安装的问题,其实还有一类问题,是word版本的问题。比如插件在office 2013 的某些低版本下运行,可能会出问题。这时候把对应的升级包打上,问题会迎刃而解。

最新文章

  1. 小菜学习设计模式(三)—工厂方法(Factory Method)模式
  2. 【2016-11-2】【坚持学习】【Day17】【通过反射自动将datareader转为实体info】
  3. C# 基础知识总结
  4. Python基础篇【第6篇】: Python装饰器
  5. php 安装memcacheq
  6. WPF窗口阴影和夜间模式的实现
  7. ember.js:使用笔记6 子项目的前进与后退
  8. JavaScript- 图片无缝滚动
  9. 悟透Javascript之 原型prototype
  10. windows服务(Windows Installer问题,错误5:拒绝访问)
  11. 在js中,window != top 的作用
  12. 【网络编程】time_wait状态产生的原因,危害,如何避免
  13. href和src的区别
  14. 善用 CSS 中的 table-layout 屬性加快 Table 的顯示速度
  15. AE项目打包
  16. 服务器集群的session管理
  17. notepad++去空格空行技巧
  18. Qt 学习之路 2(31):贪吃蛇游戏(1)
  19. 第二十一章:deploy and live updates
  20. BZOJ3132 上帝造题的七分钟 【二维树状数组】

热门文章

  1. Java:执行jar文件命令
  2. Sybase:获取本月最后一天的日期的实现方法
  3. shell 中的 eval 及 crontab 命令
  4. java jvm内存管理/gc策略/参数设置
  5. Spring 模块
  6. CommStringLib
  7. RabbitMQ 之 WorkQueues工作队列
  8. 容器编排Kubernetes之kube-dns源码解读
  9. springmvc学习(2)
  10. yii2: oracle汉字占用字节长度