深刻理解vsto,開發word插件的利器

  開發了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#

     圖:Word 對象模型

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 的某些低版本下運行,可能會出問題。這時候把對應的升級包打上,問題會迎刃而解。

相關文章
相關標籤/搜索