|
前面幾篇文章講解了Excel開發(fā)的幾個(gè)比較主要的也是比較重要的方面,比如菜單系統(tǒng),Excel對(duì)象模型,自定義函數(shù),RTD函數(shù),異步自定義函數(shù),用戶自定義任務(wù)面板等,在實(shí)際開發(fā)中我們還會(huì)遇到各種“千奇百怪”的問題,以及開發(fā)中的一些注意事項(xiàng)和技巧等,后面有空我會(huì)寫文介紹。當(dāng)我們的Excel外接應(yīng)用程序開發(fā)好了之后,需要給用戶使用,這就涉及到了應(yīng)用程序的安裝與部署,本文就簡要介紹下Excel項(xiàng)目的安裝和部署。 和一般的.NET 中的Windows Form程序不同,Excel開發(fā)通常是一種插件式的開發(fā)機(jī)制,它需要借宿在Excel上,并通過調(diào)用Excel的API來實(shí)現(xiàn)特定的業(yè)務(wù)邏輯。宿主Excel在運(yùn)行的時(shí)候,會(huì)根據(jù)當(dāng)前用戶以及Excel版本信息,讀取注冊(cè)表特定位置,以查找在本機(jī)當(dāng)前用戶下面注冊(cè)的插件信息,然后逐個(gè)加載。這里面就涉及到了和安裝部署相關(guān)的一些需要考慮的問題了。 一 插件安裝部署時(shí)需要考慮的問題Excel在安裝部署的時(shí)候,需要考慮一些問題:
在部署插件的時(shí)候,以上問題在安裝部署的時(shí)候是需要進(jìn)行考慮,并通過代碼的方式獲取的。還有一些條件,比如用戶有可能是安裝的綠色版或者不完全版的Excel,這些奇奇怪怪的問題我們都需要考慮。 但是如果考慮到了以上條件,插件的安裝和部署應(yīng)該可以達(dá)到90%以上。 要了解Excel插件的安裝部署我們需要清楚Excel是如何加載插件的,下面介紹下Excel插件的加載和運(yùn)行機(jī)制。 二 Excel插件的加載及運(yùn)行機(jī)制這里以VSTO Add-in為例,Shared Add-in原理和機(jī)制類似。 當(dāng)我們使用Office開發(fā)工具來開發(fā)Add-in的時(shí)候,我們實(shí)際上是創(chuàng)建了一個(gè)用托管代碼編寫的能夠被Office加載的程序集(assembly)。程序集加載之后,Add-in就能夠響應(yīng)Office應(yīng)用程序發(fā)起的事件了。Add-in也可以調(diào)用Office開放的對(duì)象模型來擴(kuò)展其功能,當(dāng)然也可以使用.NET 類庫中提供的各種功能。 程序集和Office的Com組件進(jìn)行交互是通過Office提供的稱之為Primary Interop Assembly (PIA)來實(shí)現(xiàn)的。 如果有多個(gè)VSTO創(chuàng)建的Add-in部署到了目標(biāo)機(jī)器,在Office啟動(dòng)的時(shí)候,每一個(gè)Add-in會(huì)被加載到各自不同的AppDomain中,這樣極大地提高了插件的穩(wěn)定性,意味著如果有一個(gè)Add-in工作不正常,不會(huì)影響其他Add-in的功能,其次,當(dāng)Office應(yīng)用程序關(guān)閉的時(shí)候,所有的Add-in的程序集都可以從內(nèi)存中清除。 雖然Add-in的程序集是開發(fā)中我們最要關(guān)注的東西,但是Office在發(fā)現(xiàn)和加載我們編寫的Add-in的時(shí)候,其他幾個(gè)組件和部分也發(fā)揮著重要作用。這對(duì)熟悉Add-in的安裝和部署有著很重要的作用。 2.1 注冊(cè)表項(xiàng)Excel 通過一系列的注冊(cè)表項(xiàng)來加載插件。在部署的時(shí)候,我們也需要將我們插件的相關(guān)信息寫入到目標(biāo)機(jī)器的注冊(cè)表中。通常在Vista及以上版本的Windows中對(duì)注冊(cè)表的操作需要獲得管理員權(quán)限。 a) 在部署的時(shí)候,我們需要確定是部署到CurrentUser還是LocalMachine節(jié)點(diǎn)下。 一般的軟件在安裝的時(shí)候都會(huì)提示該軟件是僅適用我,還是所有人。如果是僅適用于我的話,就會(huì)將注冊(cè)表信息保存在CurrentUser下,這樣只有該用戶登錄才能看到該軟件;如果是選擇所有人的話,就會(huì)寫到LocalMachine節(jié)點(diǎn)下。 使用Visual Studio創(chuàng)建的Add-in都可以部署到Current user下,但是并不是所有的都可以不會(huì)素到Local machine下,這可能和Offfice版本以及Add-in的部署方式有關(guān)。 還有一點(diǎn)需要注意的是,如果應(yīng)用程序部署到了Local machine下面,那么在Excel插件中不會(huì)顯示在Add-in外接程序列表中。 所以,一般的,我們會(huì)將應(yīng)用程序部署到Current User下。 b) Office的版本信息 Office 2010和Office 2013可以加載HKEY_LOCAL_MACHINE 和HKEY_CURRENT_USER下面的Add-in,要加載HKEY_LOCAL_MACHINE 下面的Add-in需要安裝976477補(bǔ)丁。 c) 部署類型 如果使用ClickOne部署Add-in,add-in只能在Current user下面部署,這是因?yàn)镃lickOne僅支持在HKEY_CURRENT_USER下面讀寫注冊(cè)表信息。如果要使機(jī)器上的所有用戶都能夠使用Add-in,那么需要使用Windows Installer來部署Add-in。
2.2 注冊(cè)表值這里以部署到HKEY_CURRENT_USER為例,LOCAL_MACHINE下面類似。 一般滴,Excel各產(chǎn)品會(huì)在Root\Software\Microsoft\Office\application name\Addins\add-in 下面尋找對(duì)應(yīng)的注冊(cè)表項(xiàng)。這也是最重要的一個(gè)注冊(cè)表項(xiàng)值,上圖列出的是一個(gè)我們?cè)谥拔恼轮袆?chuàng)建的那個(gè)簡單的名為YYAddin的VSTO程序。對(duì)于Shared Add-in開發(fā)的插件,該注冊(cè)表信息類似,不過也有些區(qū)別后面會(huì)說明。 這個(gè)節(jié)點(diǎn)下面的注冊(cè)表鍵值對(duì)需要說明一下。
基本上對(duì)于VSTO 應(yīng)用程序,只需要將以上部分的注冊(cè)表項(xiàng)寫入到目標(biāo)機(jī)器上即可完成安裝部署。 2.3 VSTO Runtime使用VSTO創(chuàng)建的Add-in程序,終端用戶也需要安裝VSTO的運(yùn)行時(shí)環(huán)境。該運(yùn)行時(shí)環(huán)境包含一些非托管組件以及一些托管的程序集。非托管的程序集被加載到Add-in的程序集中。托管程序集提供的對(duì)象模型能夠使得Add-in代碼可以調(diào)用Excel開放的API擴(kuò)展其功能。 2.4 加載邏輯當(dāng)用戶打開Office 軟件的時(shí)候,Office使用部署的程序及清單來定位和加載Add-in的程序集,如下圖所示: 以VSTO創(chuàng)建的Add-in為例, 步驟如下:
三 實(shí)施對(duì)于Excel插件的部署,這里分兩塊介紹,一個(gè)是VSTO項(xiàng)目的部署,一個(gè)是Com Shared Add-in類型項(xiàng)目的部署。 3.1 VSTO創(chuàng)建的插件的項(xiàng)目部署關(guān)于VSTO的部署,對(duì)于Document Level的項(xiàng)目文件,直接可以創(chuàng)建一個(gè)部署項(xiàng)目或者使用ClickOnce部署。非常簡單,博客園中,Mr.Brooks同學(xué)寫過一篇有關(guān)VSTO部署的文章 VSTO 學(xué)習(xí)筆記(十三)談?wù)刅STO項(xiàng)目的部署,這里不再贅述了。 從上圖的注冊(cè)表信息的Manifest可以看出,VSTO項(xiàng)目的程序集清單其實(shí)是一個(gè).vsto文件,它是VSTO項(xiàng)目部署時(shí)的安裝文件,用文本編輯器打開,可以看到他是一個(gè)xml文件,包含了VSTO項(xiàng)目的具體信息,如.NET運(yùn)行時(shí)版本,依賴的程序集,數(shù)字簽名等信息。 該文件默認(rèn)會(huì)使用Visual Studio Tools For Office Execution Engine打開,該組件包含在該組件包含于Visual Studio Tools For Office 運(yùn)行時(shí),因此客戶端若要運(yùn)行VSTO程序,還需要安裝Visual Studio Tools For Office 運(yùn)行時(shí)環(huán)境。Visual Studio 2010 Tools for Office Runtime 可以在這里下載。實(shí)際上,如果客戶機(jī)器上安裝了VSTO運(yùn)行時(shí)環(huán)境,只需要把編譯好的debug目錄拷貝到目標(biāo)機(jī)器,部署的時(shí)候,只需雙擊.vsto這個(gè)文件就可以完成安裝和部署。 如果將插件作為單獨(dú)的產(chǎn)品發(fā)布,以上安裝部署沒有任何問題。但是很多時(shí)候,插件是作為產(chǎn)品的一部分發(fā)布的。所以我們需要一種更靈活的方式來對(duì)項(xiàng)目進(jìn)行部署。插件的部署在本質(zhì)上就是對(duì)注冊(cè)表項(xiàng)的讀寫,了解這一點(diǎn)就很容易了。下面就簡要介紹一下如何通過手動(dòng)寫入注冊(cè)表信息的方式部署VSTO項(xiàng)目。 如前所述,Excel加載插件是通過查找特定注冊(cè)表位置來加載的,所以我們只需要在這些位置寫入注冊(cè)表信息即可。以部署我們的YYAddin為例,首先找到開發(fā)機(jī)上Visual Studio為我們創(chuàng)建好的注冊(cè)表項(xiàng),然后右鍵導(dǎo)出。保存為注冊(cè)表類型后綴為.reg的文件。 用記事本打開該reg文件。這個(gè)文件就是該Add-in在注冊(cè)表項(xiàng)中的所有內(nèi)容了。我們?cè)趯?shí)際部署的時(shí)候,可以創(chuàng)建一個(gè)exe文件,獲取用戶的系統(tǒng)位數(shù),和安裝目錄,修改該文件中的跟路徑,以及Manifest路徑,然后再動(dòng)態(tài)生成一份該文件,導(dǎo)入到目標(biāo)機(jī)器即可以完成安裝和部署。 3.2 Com SharedAddin創(chuàng)建的插件的項(xiàng)目部署和VSTO開發(fā)的插件不同,使用Shared Add-in開發(fā)的插件實(shí)際上是一個(gè)Com組件,除了在Root\Software\Microsoft\Office\application name\Addins\add-in 下面有相應(yīng)的信息之外,在ClassRoot中還有一些信息,這里以我們?cè)谇懊嫖恼轮袆?chuàng)建的名為YYSharedAddin的項(xiàng)目為例。先看看在Excel節(jié)點(diǎn)下的注冊(cè)表信息: 部署的方法和VSTO相同,只需要將該注冊(cè)表項(xiàng)導(dǎo)出,然后寫入到目標(biāo)機(jī)器即可。但是這只是第一步。細(xì)心的讀者會(huì)發(fā)現(xiàn)和VSTO項(xiàng)目相比,缺少了Manifest這個(gè)鍵值對(duì),Excel僅僅只要有一個(gè)名為YYSharedAddin.Connect 的插件需要加載,但是這個(gè)插件的程序集在哪里呢?我們接著在注冊(cè)表中搜索YYSharedAddin.Connect??梢钥吹饺缦陆Y(jié)果。 其中ProgId的值為YYSharedAddin.Connect ,這個(gè)ProgId以及 該節(jié)點(diǎn)的Guid即為我們?cè)趧?chuàng)建Shared Add-in的時(shí)候人為指定的。如下圖:
Visual Studio在編譯和調(diào)試的時(shí)候?qū)嶋H上是幫我們調(diào)用了一下指令: regasm " D:/YYUDF/YYAddIn/YYSharedAddin/bin/Debug/YYSharedAddin.dll " /codebase /s 該語句即可將相關(guān)的注冊(cè)表信息寫入到注冊(cè)表項(xiàng)中去了。這樣連同之前導(dǎo)入的注冊(cè)表,使用Shared Add-in創(chuàng)建的加載項(xiàng)的部署就完成了。 3.3 其它相關(guān)模塊的部署除了我們的主程序之外,通常我們使用Com組件方式寫的UDF函數(shù),RTD函數(shù),以及CTP等,也都需要寫入到注冊(cè)表中,最簡單的方法和上面一樣,直接使用微軟提供的Regasm工具,讀取程序集中的元數(shù)據(jù),并將所需的項(xiàng)添加到注冊(cè)表中。在部署的時(shí)候我們只需要將regasm這個(gè)工具打包一起發(fā)布,然后安裝的時(shí)候調(diào)用該命令即可。 還有一個(gè)問題,就是如果您是使用的.NET 2.0開發(fā)的Shared Add-in程序,目標(biāo)機(jī)器上安裝的是Office 2003,那么需要注意的是,Excel 2003 和Word 2003 可能在加載使用.NET 2.0創(chuàng)建的插件的時(shí)候可能會(huì)出現(xiàn)問題,因此,需要安裝名為office2003-KB907417-FullFile-ENU.exe 和extensibilityMSM.msi的Office補(bǔ)丁。所以在部署的時(shí)候,需要判斷用戶的Excel版本,以及該版本是否已經(jīng)安裝了該補(bǔ)丁,如果沒有,需要首先靜默安裝此補(bǔ)丁。 四 結(jié)語Excel插件的安裝和部署是比較重要的一個(gè)環(huán)節(jié),由于和傳統(tǒng)的Windows Form應(yīng)用程序不同,作為一種寄宿的插件,它需要往注冊(cè)表中寫入東西。本文首先介紹了Excel加載插件的步驟,Excel插件的注冊(cè)表組成部分。隨后介紹了使用VSTO和Shared Add-in創(chuàng)建插件的部署方式及注意事項(xiàng)。原理都是類似,就是往注冊(cè)表里面寫入注冊(cè)信息。對(duì)于Shared Add-in創(chuàng)建的插件,除了寫入必要的注冊(cè)表信息之外,還需要使用regasm來將dll注冊(cè)為COM可見,其實(shí)也就是通過工具來幫助我們往注冊(cè)表里寫入信息。使用類庫方式開發(fā)的UDF函數(shù),RTD函數(shù)以及CTP都需要使用regasm的方式注冊(cè),才能在Excel中進(jìn)行調(diào)用。最后介紹了在Office 2003中要使用插件必須要安裝的兩個(gè)補(bǔ)丁,完成了這些步驟,您開發(fā)的插件基本上就可以部署到絕大部分的目標(biāo)機(jī)器上了。 希望本文對(duì)您了解Excel插件的加載機(jī)制和安裝部署有所幫助。 |
|
|