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