深入理解vsto,開發word外掛的利器
開發了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(3); });
所謂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 的某些低版本下執行,可能會出問題。這時候把對應的升級包打上,問題會迎刃而解。