小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

淺談Excel開發(fā):八 Excel 項(xiàng)目的安裝部署

 法效天地 2014-01-29

    前面幾篇文章講解了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í)候,需要考慮一些問題:

  • 插件的類型,是Document Level,還是Application Level,是基于VSTO開發(fā)還是Shared Add-in技術(shù)開發(fā)。這個(gè)對(duì)于安裝部署有較大影響。
  • 判斷待部署機(jī)器的位數(shù),32位和64位機(jī)器Excel的插件信息在注冊(cè)表的位置有所不同,對(duì)于64位操作系統(tǒng),某些內(nèi)容會(huì)寫到\Wow6432Node\節(jié)點(diǎn)下。
  • 待部署用戶的機(jī)器上是否安裝有Excel,Excel的版本是多少,Excel的位數(shù)是多少,如果是安裝的Office 2003 是否安裝有SP3 補(bǔ)丁,以及補(bǔ)丁版本號(hào)是多少。這里需要說明的是,從Office 2010開始,Excel分為32位和64位版本,這兩個(gè)版本的dll在一般情況下是不能夠兼容的,在應(yīng)用開發(fā)中,如果我們的插件決定兼容這兩個(gè)版本,那么還需要對(duì)于不同的目標(biāo)機(jī)器需要分別編譯發(fā)布相應(yīng)的dll;如果不兼容,則還需要判斷Office的版本。
  • 如果是使用.NET 技術(shù)開發(fā),需要判斷用戶機(jī)器上是否安裝有.NET Framework以及Framework的版本。
  • 如果用戶安裝的是Excel 2003,如果用到了某些功能,需要判斷用戶是否安裝了相應(yīng)的補(bǔ)丁,如果沒有安裝,需要靜默安裝。
  • 安裝完成后,相應(yīng)的權(quán)限設(shè)定,比如對(duì)于某些目錄,需要添加到安全目錄,這樣Excel在打開自己的帶有宏文件的目錄時(shí)不會(huì)提示不安全。

    在部署插件的時(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)下。

LocalMachine and Current User in  Register

    一般的軟件在安裝的時(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外接程序列表中。

Addin was not shown in Local machine

    所以,一般的,我們會(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下面類似。

Addin register in HKEY_CURRENT_USER

     一般滴,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ì)需要說明一下。

  • Description字段: 類型為REG_SZ,必須,該字段為對(duì)該Addin的簡要描述,該表述會(huì)出現(xiàn)在Opption->Add-Ins菜單中。如下圖:

VSTO ADDIN DESCRIPTION

  • FriendlyName,字段類型為REG_SZ,必須。這個(gè)實(shí)在開發(fā)工具->Com加載相中顯示的名稱。默認(rèn)是改Addin的Id,如下圖。

VSTO ADDIN FRIENDLYNAME

  • LoadBehavior字段REG_DWORD類型,必須。這個(gè)字段比較重要,用來指明插件的加載行為和狀態(tài) (加載或者卸載),默認(rèn)為3,表示當(dāng)應(yīng)用程序加載時(shí),即加載該插件。其枚舉值為http://msdn.microsoft.com/en-us/library/bb386106.aspx#LoadBehavior ,在我們調(diào)試程序的時(shí)候,如果程序出現(xiàn)異常,通常Excel會(huì)將該插件的該項(xiàng)值改為2或者其他非3的值,表示下次請(qǐng)啟動(dòng)的時(shí)候不會(huì)加載。
  • Manifest,REG_SZ類型,對(duì)于VSTO開發(fā)的應(yīng)用程序,該字段必須設(shè)定。該字段指明該插件的部署后的程序集清單的位置,可以指定為本機(jī),網(wǎng)絡(luò)共享,或者一個(gè)位于Web服務(wù)器上的位置。對(duì)于Shared Add-in類型的程序,該字段不必須,他會(huì)有另外一套機(jī)制來加載插件。

    基本上對(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的程序集,如下圖所示:

Addin work with Office

以VSTO創(chuàng)建的Add-in為例, 步驟如下:

  1. Office應(yīng)用程序檢查位于注冊(cè)表項(xiàng)中的使用VSTO創(chuàng)建的Addin
  2. 如果找到了Add-in的注冊(cè)表信息,Office會(huì)在家VSTOEE.dll,該dll會(huì)加載VSTOLoader.dll.這些都是VSTO 運(yùn)行時(shí)環(huán)境中的非托管dll。
  3. VSTOLoader.dll會(huì)加載.NET Framework,并啟動(dòng)VSTO運(yùn)行時(shí)環(huán)境中的托管代碼。
  4. VSTO運(yùn)行時(shí)環(huán)境會(huì)檢查該Add-in的程序集清單,檢查是否有更新,有的話下載更新。
  5. VSTO運(yùn)行時(shí)環(huán)境會(huì)進(jìn)一步執(zhí)行一系列安全性檢查。
  6. 如果Add-in運(yùn)行運(yùn)行,VSTO運(yùn)行時(shí)環(huán)境會(huì)使用部署的程序集清單以及應(yīng)用程序的清單來檢查程序集是否有更新,如果有新的程序集,則運(yùn)行時(shí)會(huì)下載最新的程序集到ClickOne的緩存中放到用戶機(jī)器上。
  7. VSTO運(yùn)行時(shí)環(huán)境會(huì)創(chuàng)建一個(gè)新的應(yīng)用程序域,然后將Add-in的程序集加載進(jìn)來。
  8. VSTO運(yùn)行時(shí)環(huán)境調(diào)用ThisAddIn_Startup方法然后Add-in插件啟動(dòng)。

三 實(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ù)字簽名等信息。

VSTO FILE DETAIL

    該文件默認(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è)文件就可以完成安裝和部署。

Install VSTO USING VSTORT

    如果將插件作為單獨(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的文件。

deploy vsto using register

    用記事本打開該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ī)器即可以完成安裝和部署。

VSTO REGEDIT FILE

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è)表信息:

SharedAddin register in excel

    部署的方法和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é)果。

SharedAddin register in excel class root 2

SharedAddin register in excel class root

   其中ProgId的值為YYSharedAddin.Connect ,這個(gè)ProgId以及 該節(jié)點(diǎn)的Guid即為我們?cè)趧?chuàng)建Shared Add-in的時(shí)候人為指定的。如下圖:

SharedAddin Project     在前面的文章中講過,要編譯Shared Add-in以及我們使用類庫編寫的UDF函數(shù),RTD函數(shù)以及CTP,這些其實(shí)都是Com組件,需要管理員權(quán)限運(yùn)行Visual Studio,并且在項(xiàng)目的屬性->編譯選項(xiàng)中選中注冊(cè)為Com組件。如下圖:

SharedAddin Register for Com interop 

    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.exeextensibilityMSM.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ī)制和安裝部署有所幫助。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多