开发了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 的某些低版本下运行,可能会出问题。这时候把对应的升级包打上,问题会迎刃而解。

深入理解vsto,开发word插件的利器的更多相关文章

  1. 接触vsto,开发word插件的利器

    研究word插件有一段时间了,现在该是总结的时候了. 首先咱们来了解下什么是vsto?所谓vsto,就是vs面向office提供的一个开发平台.一个开发平台至少包含两个要素:开发工具(sdk)和运行环 ...

  2. Excel催化剂开源第32波-VSTO开发的插件让WPS顺利调用的方法-注册表增加注册信息

    VSTO插件开发完成后,鉴于现在WPS用户也不少,很多时候用户没办法用OFFICE软件,只能在WPS环境下办公,VSTO开发的插件,只需增加一句注册表信息,即可让WPS识别到并调用VSTO开发的功能, ...

  3. VSTO中Word的查找方式

    VSTO中Word的查找方式 前言 使用C#在VSTO开发Word插件的过程,经常需要对文档中的内容进行查找和替换.在Word中进行文本的查找替换,和一般对纯文本的查找替换却不太一样.因为Word文档 ...

  4. outlook2013插件 VSTO开发与部署

    一.背景 最近因为项目需要对outlook开发一个插件,功能是将outlook的邮件作导出功能,需要使用VSTO开发一个插件将邮件进行导出的操作.于是,开始学习VSTO outlook的开发了,折腾了 ...

  5. 个人用户永久免费,可自动升级版Excel插件,使用VSTO开发,Excel催化剂安装过程详解及安装失败解决方法

    因Excel催化剂用了VSTO的开发技术,并且为了最好的用户体验,用了Clickonce的布署方式(无需人工干预自动更新,让用户使用如浏览器访问网站一般,永远是最新的内容和功能).对安装过程有一定的难 ...

  6. vsto下开发wps插件

    我们要开发wps插件了.之前用vsto开发过word插件,我也讲过c#下如何开发wps插件(有点繁琐).如果采用c#从头再开发wps插件,那么开发出来的office加载项就会出现两个.我们要实现的wp ...

  7. c#开发wps插件(3)部署

    上一篇,我们完成了具体的开发工作,但是最终必须得部署到客户机器上.所以,部署方面,我花费了一些时间去研究,现在总结下.上一篇中,我为什么建议开发人员安装wps专业版呢?因为装了专业版,方便我们开发,安 ...

  8. 教你开发jQuery插件(转)

    教你开发jQuery插件(转) 阅读目录 基本方法 支持链式调用 让插件接收参数 面向对象的插件开发 关于命名空间 关于变量定义及命名 压缩的好处 工具 GitHub Service Hook 原文: ...

  9. 自己动手开发jQuery插件

    因为工作需要,所以这几天琢磨了一下关于jQuery插件开发的问题,经过一天鏖战,终于完成自己动手做的第一个jQuery插件,对于俺这种见了css就蛋疼菊紧的人来说,一天时间8小时,保守估计有5个小时在 ...

随机推荐

  1. Python面试题之Python和Java中Super方法的区别

    python 的 super 是一个函数,需要两个参数,第一个参数是类,第二个参数是实例,返回值是一个类对象. 其意义是:站在参数2这个实例的角度看去, 参数1这个类的‘父亲’是谁,把‘父亲’返回. ...

  2. C++命名(自定义)

    1.自定义函数 void GetName(): 2.布尔型变量 BOOL ISOPEN:

  3. COS-5资源分配与调度

    操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口.操作系统的功能包括管理计算机系统的硬件.软件及数据资源,控制程序运行,改善人机界面,为其它应用软件提供支持,让计算机系统所有资源最大限 ...

  4. iOS动画进阶 - 手摸手教你写 Slack 的 Loading 动画

    如果移动端访问不佳,可以访问我的个人博客 前几天看了一篇关于动画的博客叫手摸手教你写 Slack 的 Loading 动画,看着挺炫,但是是安卓版的,寻思的着仿造着写一篇iOS版的,下面是我写这个动画 ...

  5. scala学习手记25 - Curry化

    curry翻译为中文就是咖喱.意为使用curry可以让代码更有味道. scala里的curry化可以把函数从接收多个参数转换成接收多个参数列表.也就是说我们要编写的函数不是只有一个参数列表,这个参数列 ...

  6. Apache顶级项目 Calcite使用介绍

    什么是Calcite Apache Calcite是一个动态数据管理框架,它具备很多典型数据库管理系统的功能,比如SQL解析.SQL校验.SQL查询优化.SQL生成以及数据连接查询等,但是又省略了一些 ...

  7. 公共域名服务DNS 114.114.114.114和8.8.8.8

    一.两者的联系 114.114.114.114和8.8.8.8,这两个IP地址都属于公共域名解析服务DNS其中的一部分,而且由于不是用于商业用途的,这两个DNS都很纯净,不用担心因ISP运营商导致的D ...

  8. HDU 1856 并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=1856 More is better Time Limit: 5000/1000 MS (Java/Others) ...

  9. iOS-免证书真机调试

     使用方法: 1.新建一个普通的项目 2.进入xcode,菜单栏选择xcode –> preferences (快捷键 command + ,) 3.在Accounts选项卡添加自己的Apple ...

  10. Java基础摘要(一)

    三大特性 封装 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是面向对象的特征之一,是对象和类概念的主要特性.简单的说,一 ...