開發(fā)了vsto,客戶那邊也有一些反映插件安裝失敗或者加載不上的情況。于是我下定決定再理解下vsto的工作機(jī)制,如下圖:
如上圖所示,我把vsto的解決方案分為兩部分,一部分是vsto Add-ins,另外一部分是Microsoft Office Applications。它們之間是如何交互的呢?要回答這個問題,必須對這兩部分有一定的認(rèn)識。首先vsto Add-ins是我們用c#開發(fā)的托管代碼,office是基于com產(chǎn)品。微軟提供了PIA(程序互操作集),它作為.net調(diào)用com的一個接口。它們之間的具體交互圖,見下一篇??傊?,vsto add-ins通過PIA,調(diào)用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 對象模型層次結(jié)構(gòu)中這些對象的一個視圖。
vsto addin是如何加載的?它的執(zhí)行過程是什么?
對照文章開頭的那個圖(標(biāo)出了順序),我們來理一理:
1、office應(yīng)用程序查看注冊表,通過注冊表得知vsto部署及應(yīng)用清單文件。
2、office應(yīng)用程序加載VSTOEE.dll,這是非托管的程序集,它屬于vsto runtime的一部分。它的作用是什么呢?為vsto runtime做一些準(zhǔn)備工作,比如說,檢查runtime的版本等。
3、VSTOEE.dll 加載 VSTOLoader.dll,這是vsto runtime的另一個非托管程序集(實(shí)現(xiàn)了com插件的接口,因?yàn)槲覀冎?,?shí)現(xiàn)office加載項(xiàng),本質(zhì)上是實(shí)現(xiàn)com插件的接口)。它做了兩件事情。
3.1 加載了vsto runtime中的一些托管程序集。
3.2 加載了.net framework。
4、vsto runtime 創(chuàng)建了一個app domain,加載vsto addin Assembly
經(jīng)過這4步,office就可以和vsto addin快樂地交互了。
附:平??蛻羰褂眠^程中的一些問題,我總結(jié)了如下:
1、在反復(fù)安裝卸載過程中出現(xiàn),安裝或者卸載都可能出現(xiàn)如下問題,解決辦法,安裝vc++ 2010,有的情況下可以解決,有的時(shí)候解決不掉,不知道why。
2、不知道什么情況下出現(xiàn)的錯誤,不過極少出現(xiàn):
解決方法:
3、未將對象引用到實(shí)例:
從上圖可以看出,追蹤到底層,發(fā)現(xiàn)framework中的異常。
解決方法,安裝.netframework 3.5 sp1 ,這個不一定能解決問題,具體哪出問題了,還不明確,畢竟是極少數(shù)的用戶有這問題,我初步懷疑是操作系統(tǒng)的問題,因?yàn)槲覀儑业暮芏嗳硕加帽I版的。
4、已經(jīng)安裝了另一個版本:
解決方法,這個好解決(與緩存有關(guān)系),一般藥到病除:
5、操作office時(shí)報(bào)錯:
解決方法:
"D:\Microsoft Office 2003\OFFICE11\EXCEL.EXE" /regserver
6、加載項(xiàng)出現(xiàn)錯誤:
winxp, office 2007
vsto是通過C:\Program Files\Common Files\microsoft shared\VSTO\10.0下的VSTOInstaller.exe進(jìn)行安裝的。雙擊VSTOInstaller.exe報(bào)無法找到入口的錯誤。后來發(fā)現(xiàn)XP等NT5.x系統(tǒng)安裝時(shí)都報(bào)【VSTOInstaller.exe無法定位程序輸入點(diǎn)GetFileVersionInfoExW】:
原因是自動下載的runtime有烏龍,說好支持XP,但其實(shí)里面用到了NT6.x才有的API,比如上面那個GetFileVersionInfoExW,所以要么【發(fā)布>系統(tǒng)必備】中不要勾【創(chuàng)建用于安裝系統(tǒng)必備組件的安裝程序】,手動下載XP可用的runtime安裝(版本10.0.50903,而自動下載的版本以及下載中心的版本都比這個高,都有烏龍),下載地址:
http://download.microsoft.com/download/C/0/0/C001737F-822B-48C2-8F6A-CDE13B4B9E9C/vstor_redist.exe
需要注意:卸載錯版后相關(guān)文件也許會遺留,在【C:\Program Files\Common Files\Microsoft Shared\VSTO\10.0\】,這樣你就算裝了對版,文件也不會變,問題依舊,所以安裝對版之前需檢查并清空上述目錄。
以上是在實(shí)際當(dāng)中經(jīng)常出現(xiàn)的問題。我做了匯總。出了這些插件安裝的問題,其實(shí)還有一類問題,是word版本的問題。比如插件在office 2013 的某些低版本下運(yùn)行,可能會出問題。這時(shí)候把對應(yīng)的升級包打上,問題會迎刃而解。