最近有一些網友反應:安裝了增益集所需的相關檔案卻無法正常啟動增益集。這樣的問題在從事設計增益集的過程中,其實一直有發生,很多到現在依然沒有找到解決方案,現在越來越複雜的office功能與作業系統環境,完全相容真的是一個不容易達成的任務,究竟自己不是一個專業的程式設計者,也沒有那麼多設備與環境可以測試,很多時候問題都是透過使用者反應才發現。
同一個增益集在某些環境下無法啟動或正常使用,我的經驗發現除了與新的作業系統的安全要求有關,也和開發增益集的工具有關,雖然微軟已經宣佈win7支援vb6開發的程式,但之前我利用vb6增益集介面所開發的增益集,只能在xp作業系統中使用,拿到win7或vista安裝使用,就是無法正常啟用。但是利用c++依照com的標準去設計的增益集,就沒有這樣的問題。
另外很多剛學習設計增益集的初學者,按照書本範例利用vsto來開發增益集,程式在vs2003或vs2005中跑都沒有問題,但是一但封裝成安裝檔案拿到沒有裝vs的環境,安裝了怎樣就是跑不起來,其中的關鍵在於.net環境的安全性設定,在這兩版的vs開發者都必須做一些額外的工作,簡單的說就是要設定所開發出來的增益集或office solution 能夠被使用者的.net環境信任,否則就沒辦法在使用者的環境跑起來,關於這個問題微軟提供的方法有很多種,在msdn網站找到幾篇相關的文章,有興趣的讀者不妨看看:
Deploying Application-Level Add-ins
使用程式碼存取安全性原則工具 (Caspol.exe) 設定安全性原則
目前尚未利用vs2010開發增益集,不知道vs2010在這方面是否有改進。
了解office增益集的類型對於開發增益集有一定的幫助,不同office的系列軟體支援的類型也不盡相同,而可以開發增益集的程式語言也不只一種,有些發展歷史較早的像Excel,其支援的增益集類型就有好幾種,從Excel增益集的管理表單可以看到多種類型,雖然Excel增益集分成下圖中幾類:
但是如果從副檔案名稱來區分,大概有以下幾類,簡單說明:
1..xll:例如著名的分析工具箱增益集(它的檔名”analys.xll”),.xll是很早期EXCEL外掛程式類型,從Excel 4.0就支援此種格式的增益集,這種增益集是以C或C++程式語言開發出來的,這種類型自從Excel5.0之後並沒有太大改變,到了Excel2007才有一些較大的改變,在msdn有一篇關於開發.xll增益集的文章:Developing Add-ins (XLLs) in Excel 2007 ,在微軟的網站也可以找到相關的SDK。Microsoft Office Excel 2007 XLL Software Development Kit
2..xla與.xlam:這個類型是我最早認識的增益集類型,自Excel5.0支援Visual Basic for Applications,這個對於office應用的開發起了關鍵性的影響,記得自己最早接觸的關於增益集的知識,是來自於洪士吉先生的大作EXCEL 97 VBA巨集程式範例,看到書中所展示範的種種對當時的我近乎是神奇的範例,讓我見識到Excel的威力與其發展性,而且容易入門的特質,而VBA的IDE直接附加於office的系列軟體中,讓我選擇以office平台作為自己cai設計的平台。
只要在Excel中的VBA的IDE建立好巨集程式,然後把工作簿的IsAddin屬性改為true,檔案儲存為副檔名.xla(2003之後的副檔名為.xlam),即可發佈為增益集。Excel2007只要在增益集的管理介面選擇”Excel增益集”,按下『執行』即可
在增益集的表單中點選瀏覽,找到儲存增益集的位置把增益集掛上即可,或者將增益集儲存至office預設的增益集目錄,增益集管理表單自動會出現該增益集名稱,使用者只要在表單上勾選即可。
3..dll:這種副檔名通常是COM類型的增益集,只要依照COM的規準,可以使用不同的程式語言設計COM元件,所以COM類型的增益集可以用不同種的程式語言來開發,我習慣用VB來設計,因為與最先學習的VBA相容,再者VB將開發COM中的一些細節包裹起來,對於我們這些半路出家的開發者降低很多學習的門檻,用C++複雜多了,在VB中只要幾行程式可以完成的,C++中必須了解很多跟COM相關的細節才不容易出錯。不過VB這種好日子也沒有太久,.NET出來之後,再加上新版OFFICE的RIBBON介面,跟傳統CommandBars又不同,又必須花一段時間了解其概念。
4..manifest:這種這種副檔名是利用.NET類型程式語言所開發的COM類型的增益集,這個.manifest並不是主要的程式碼的部分,用筆記本程式打開來看,可以看到是xml樣子的檔案,記錄了增益集檔案的一些資訊,增益集管理的介面是利用這個檔案記錄的資訊去載入增益集,如果這個檔案不正確的載入會失敗。