使用 Windows Installer 部署 VSTO 方案
摘要
了解如何使用 Visual Studio 安裝程式專案部署 Microsoft Visual Studio Tools for Office (VSTO) 增益集或文件層級方案。
Wouter van Vugt,Code Counsel
Ted Pattison,Ted Pattison 集團
本文已由 Microsoft 經原作者許可進行更新。
適用於: Visual Studio Tools for Office、Microsoft Office、Microsoft Visual Studio。
您可以使用 Windows Installer 套件來開發 VSTO 方案並部署方案。 本討論包含部署簡單 Office 增益集的步驟。
部署方法
ClickOnce 可以輕鬆地用來建立增益集和方案的安裝程式。 但是,它無法安裝需要管理權限的增益集,例如:機器層級增益集。
可以使用 Windows Installer 來安裝需要管理權限的增益集,但建立安裝程式確實需要更多精力。
如需如何使用 ClickOnce 部署 VSTO 方案的概觀,請參閱使用 ClickOnce 部署 Office 方案。
部署以 VSTO 執行階段為目標的 Office 方案
安裝 Office 方案時,ClickOnce 和 Windows Installer 套件需要執行相同的基本任務。
- 在使用者電腦上安裝必要元件。
- 部署方案的特定元件。
- 對於增益集,建立登錄項目。
- 信任該方案以允許其執行。
目標電腦上所需的必要元件
以下是電腦上必須安裝才能執行 VSTO 方案的軟體清單:
- Microsoft Office 2010 或更新版本。
- Microsoft .NET Framework 4 或更新版本。
- Microsoft Visual Studio 2010 Tools for Office Runtime。 執行階段提供管理增益集和文件層級方案的環境。 Microsoft Office 隨附確實執行階段版本,但您可能想要使用增益集轉散發特定版本。
- 如果您未使用內嵌的 Interop 型別,則為 Microsoft Office 的主要 Interop 組件。
- 專案所參考的任何公用程式組件。
解決方案的特定元件
安裝程式套件必須將這些元件安裝到使用者的電腦上:
- 如果您建立文件層級方案,則為 Microsoft Office 文件。
- 自訂組件和它所需的任何組件。
- 其他元件,例如:設定檔。
- 應用程式資訊清單 (.manifest)。
- 部署資訊清單 (.vsto)。
增益集的登錄項目
Microsoft Office 會使用登錄項目來尋找及載入增益集。這些登錄項目應建立為部署流程的一部分。 如需這些登錄項目的詳細資訊,請參閱 VSTO 增益集的登錄項目。
顯示自訂表單區域的 Outlook 增益集需要其他登錄項目,才能識別表單區域。 如需關於登錄項目的詳細資訊,請參閱 Outlook 表單區域登錄項目。
文件層級方案不需要任何登錄項目。 相反地,文件內的屬性會用來尋找自訂。 如需這些屬性的詳細資訊,請參閱自訂文件屬性概觀。
信任 VSTO 方案
若要執行自訂,機器必須信任方案。 信任增益集的方法為使用憑證簽署資訊清單、建立與包含清單的信任關係,或將它安裝到機器上的信任位置。
如需如何取得憑證以進行簽署的詳細資訊,請參閱 ClickOnce 部署和 Authenticode。 如需信任方案的詳細資訊,請參閱 使用包含清單信任 Office 方案。 您可以在 Windows Installer 檔案中使用自訂動作來新增包含清單項目。 如需啟用包含清單的詳細資訊,請參閱 如何:設定包含清單的安全性。
如果未使用任一選項,則會向使用者顯示信任提示,讓他們決定是否信任方案。
如需文件層級方案相關安全性的詳細資訊,請參閱將信任授與文件。
建立基本安裝程式
安裝程式和部署專案範本包含在可供下載的 Microsoft Visual Studio 安裝程式專案擴充功能中。
若要建立 Office 方案的安裝程式,必須完成這些工作:
- 新增將部署的 Office 方案元件。
- 對於應用程式層級增益集,設定登錄機碼。
- 設定必要元件,使其可以安裝在終端使用者計算機上。
- 設定啟動條件,以確認必要的必要條件元件可供使用。 如果未安裝所有必要的必要條件,可以使用啟動條件來封鎖安裝。
第一個步驟是建立安裝程式專案。
建立增益集安裝程式專案
- 開啟要部署的 Office 增益集專案。 在此範例中,我們使用名為 ExcelAddIn 的 Excel 增益集。
- 開啟 Office 專案後,在 [檔案] 功能表上,展開 [新增],然後按一下 [新增專案] 以新增專案。
- 從 [新增專案] 對話方塊中選取 [安裝專案] 範本。
- 按一下 [下一步]。
- 在 [名稱] 方塊中,鍵入 OfficeAddInSetup。
- 按一下 [建立] 建立新的安裝專案。
Visual Studio 會開啟新安裝專案的 [檔案系統總管]。 [檔案系統總管] 可讓您將檔案新增至安裝專案。
圖 1:安裝專案的系統系統總管
安裝專案需要部署 ExcelAddIn。 您可以將 ExcelAddIn 專案輸出新增至安裝專案,以設定這項工作的安裝專案。
若要新增 ExcelAddIn 專案輸出
以滑鼠右鍵按一下 [方案總管] 中的 [OfficeAddInSetup],按一下 [加入],然後按一下 [專案輸出]。
在 [新增專案輸出群組] 對話方塊中,從專案清單中選取 [ExcelAddIn],然後選取 [主要輸出]。
按一下 [確定] 將專案輸出新增至安裝專案。
圖 2:[安裝專案新增專案輸出群組] 對話方塊
安裝專案需要部署部署資訊清單和應用程式資訊清單。 從 ExcelAddIn 專案的輸出資料夾,將這兩個檔案做為獨立檔案新增至安裝程式專案。
新增部署和應用程式資訊清單
在 [方案總管] 中,以滑鼠右鍵按一下 [OfficeAddInSetup],按一下 [新增],然後按一下 [檔案]。
在 [新增檔案] 對話方塊中,瀏覽至 [ExcelAddIn] 輸出目錄。 輸出目錄通常是專案根目錄的 bin\release 子資料夾,視所選的組建組態而定。
選取 [ExcelAddIn.vsto] 和 [ExcelAddIn.dll.manifest] 檔案,然後按一下 [開啟] 將這兩個檔案新增至安裝專案。
圖 3:在方案總管中增益集的應用程式和部署資訊清單
參考 ExcelAddIn 包含 ExcelAddIn 所需的所有元件。 這些元件必須使用必要套件來排除和部署,才能正確註冊這些元件。 此外,必須先顯示並接受軟體授權條款,才能開始安裝。
排除 ExcelAddIn 專案相依性
在 [方案總管] 的 OfficeAddInSetup 節點中,選取 [偵測到的相依性] 項目底下的所有相依性專案,但 Microsoft .NET Framework 或任何以 *Utilities.dll 結尾的元件除外。 公用程式組件要與您的應用程式一起部署。
以滑鼠右鍵按一下該群組,然後選取 [屬性]。
在 [屬性] 視窗中,將 Exclude 屬性變更為 True,以從安裝專案中排除相依組件。 請務必不要排除任何公用程式組件。
圖 4:排除相依性
您可以藉由新增安裝程式 (也稱為啟動程序),來設定 Windows Installer 套件以安裝必要元件。 此安裝程式可以安裝必要元件,這個過程稱為啟動程序。
對於 ExcelAddIn,必須先安裝這些必要條件,增益集才能正確執行:
- 做為 Office 方案目標的 Microsoft .NET Framework 版本。
- Microsoft Visual Studio 2010 Tools for Office Runtime。
設定相依元件為必要條件
在 [方案總管] 上,以滑鼠右鍵按一下 [OfficeAddInSetup] 專案,並選取 [屬性]。
[OfficeAddInSetup 屬性頁] 對話方塊隨即出現。
按一下 [必要條件] 按鈕。
在 [必要條件] 對話方塊中,選取正確版本的 .NET Framework 和 Microsoft Visual Studio Tools for Office Runtime。
圖 5:必要條件對話方塊
注意
Visual Studio 安裝專案中設定的一些必要條件套件取決於選取的組建設定。 您必須為您使用的每個組建設定選擇正確的必要元件。
Microsoft Office 會使用登錄機碼來尋找增益集。 HKEY_CURRENT_USER 登錄區中的機碼是用來註冊每個個別使用者的增益集。 HKEY_LOCAL_MACHINE hive 登錄區中的機碼可用來註冊機器的所有使用者增益集。 如需登錄機碼的詳細資訊,請參閱VSTO 增益集的登錄項目。
若要設定登錄
在 [方案總管] 中,以滑鼠右鍵按一下 OfficeAddInSetup。
展開 [檢視]。
按一下 [登錄] 以開啟登錄編輯程式視窗。
在 [登錄(OfficeAddInSetup)] 編輯程式中,展開 [HKEY_LOCAL_MACHINE],然後展開 [軟體]。
刪除在 [HKEY_LOCAL_MACHINE\Software] 底下找到的 [Manufacturer] 機碼。
展開 [HKEY_CURRENT_USER],然後展開 [軟體]。
刪除在 [HKEY_CURRENT_USER\Software] 底下找到的 [Manufacturer] 機碼。
若要為增益集安裝新增登錄機碼,以滑鼠右鍵按一下 [使用者/機器登錄區] 機碼,選取 [新增機碼]。 使用 [軟體] 文字以取得新機碼的名稱。 以滑鼠右鍵按一下新建立的 [軟體] 機碼,並使用 [Microsoft] 文字建立新的機碼。
使用類似的流程來建立增益集註冊所需的整個金鑰階層:
User/Machine Hive\Software\Microsoft\Office\Excel\Addins\SampleCompany.ExcelAddIn
公司名稱通常用來做為增益集名稱的前置詞,以提供唯一性。
以滑鼠右鍵按一下 [SampleCompany.ExcelAddIn] 機碼,選取 [新增],然後按一下 [字串值]。 使用 [描述] 文字做為名稱。
使用此步驟新增另外三個值:
- FriendlyName 類型為 [字串]
- LoadBehavior 類型為 DWORD
- Manifest 類型為 [字串]
以滑鼠右鍵按一下註冊編輯程式中的 [描述] 值,然後按下 [屬性視窗]。 在 [屬性] 視窗中,輸入 [Excel Demo AddIn] 作為值屬性。
在註冊編輯程式中選取 [FriendlyName] 機碼。 在 [屬性] 視窗中,將 [值] 屬性更改為 [Excel Demo AddIn]。
在註冊編輯程式中選取 [LoadBehavior] 機碼。 在 [屬性視窗] 中,將 [值] 屬性更改為 3。LoadBehavior 的值 3 表示應在主應用程式啟動時載入增益集。 如需載入行為的詳細資訊,請參閱VSTO 增益集的登錄項目。
在註冊編輯程式中選取 [資訊清單] 機碼。 在 [屬性視窗] 中,將 [值] 屬性更改為 file:///[TARGETDIR]ExcelAddIn.vsto|vstolocal
圖 6:設定登錄機碼
VSTO 執行階段會使用此登錄機碼來尋找部署資訊清單。 [TARGETDIR] 巨集將會取代為安裝增益集的資料夾。 巨集會包含尾端 \ 字元,因此部署資訊清單的檔名應該是 ExcelAddIn.vsto 並且沒有 \ 字元。 vstolocal 後置詞會告訴 VSTO 執行階段增益集應從這個位置載入,而不是 ClickOnce 快取。 拿掉此後置詞會導致執行階段將自訂複製到 ClickOnce 快取。
警告
您應該非常小心 Visual Studio 中的登錄編輯程式。 例如,如果您不小心為錯誤的機碼設定 DeleteAtUninstall,則可能會刪除登錄的作用中部分,讓使用者電腦處於不一致或甚至更糟的狀態。
64 位元版本的 Office 會用 64 位元登錄區來尋找增益集。若要註冊 64 位元登錄區下的增益集,安裝專案的目標平台必須僅能設定為 64 位元。
- 在 [方案總管] 中,選取 OfficeAddInSetup 專案。
- 移至 [屬性] 視窗,並將 [TargetPlatform] 屬性設定為 x64。
為 32 位元和 64 位元版本的 Office 安裝增益集將會要求您建立兩個不同的 MSI 套件。 一個用於 32 位元,另一個用於 64 位元。
圖 7:使用 64 位元 Office 註冊增益集的目標平台
如果使用 MSI 套件來安裝增益集或方案,則可能可以在未安裝所需先必要條件的情況下進行安裝。 如果未安裝必要條件,您可以使用 MSI 中的啟動條件來封鎖增益集。
設定啟動條件以偵測 VSTO 執行階段
在 [方案總管] 中,以滑鼠右鍵按一下 OfficeAddInSetup。
展開 [檢視]。
按一下 [啟動條件]。
在 [啟動條件 (OfficeAddInSetup)] 編輯程式中,以滑鼠右鍵按一下 [目標機器上的要求],然後按一下 [新增登錄啟動條件]。 此搜尋條件可以在登錄中搜尋 VSTO 執行階段安裝的機碼。 接著,機碼的值可透過具名屬性提供給安裝程式的各個部分。 啟動條件使用搜尋條件定義的屬性來檢查特定值。
在 [啟動條件 (OfficeAddInSetup)] 編輯程式中,選取 [搜尋 RegistryEntry1] 搜尋條件,以滑鼠右鍵按一下條件,然後選取 [屬性視窗]。
在 [屬性] 視窗中,設定這些屬性:
- 將 (名稱) 的值設定為 [搜尋 VSTO 2010 執行階段]。
- 將 [屬性] 值變更為 VSTORUNTIMEREDIST。
- 將 RegKey 的值設定為 SOFTWARE\Microsoft\VSTO Runtime Setup\v4R
- 將 Root 屬性設定為 vsdrrHKLM。
- 將 [值] 屬性變更為 [版本]。
在 [啟動條件 (OfficeAddInSetup)] 編輯程式中,選取 [Condition1] 啟動條件,以滑鼠右鍵按一下條件,然後選取 [屬性視窗]。
在 [屬性] 視窗中,設定這些屬性:
將 (名稱) 設定為 [驗證 VSTO 2010 執行階段可用性]。
將 [條件] 的值變更為 VSTORUNTIMEREDIST>=“10.0.30319”
將 [InstallURL] 屬性保留空白。
將訊息設定為未安裝 Visual Studio 2010 Office Runtime 工具。請執行 Setup.exe 來安裝增益集。
圖 8:驗證執行階段可用性啟動條件的屬性視窗
上述啟動條件會明確檢查啟動載入器套件安裝 VSTO 執行階段是否存在。
設定啟動條件以偵測 Office 安裝的 VSTO 執行時間
在 [啟動條件 (OfficeAddInSetup)] 編輯程式中,以滑鼠右鍵按一下 [搜尋目標機器],然後按一下 [新增登錄搜尋]。
選取 [搜尋 RegistryEntry1] 搜尋條件,以滑鼠右鍵按一下條件,然後選取 [屬性視窗]。
在 [屬性] 視窗中,設定這些屬性:
- 將 (名稱) 的值設定為 [搜尋 Office VSTO 執行階段]。
- 將 [屬性] 值變更為 [OfficeRuntime]。
- 將 RegKey 的值設定為 SOFTWARE\Microsoft\VSTO Runtime Setup\v4。
- 將 Root 屬性設定為 vsdrrHKLM。
- 將 [值] 屬性變更為 [版本]。
在 [啟動條件 (OfficeAddInSetup)] 編輯程式中,選取先前定義的 [驗證 VSTO 2010 執行階段可用性] 啟動條件,以滑鼠右鍵按一下條件,然後選取 [屬性視窗]。
將 [條件] 屬性的值變更為 VSTORUNTIMEREDIST> =“10.0.30319” OR OFFICERUNTIME>=“10.0.21022”。 根據您的增益集所需的執行時間版本,版本號碼可能會有所不同。
圖 9:透過 Redist 或 Office 啟動條件驗證執行階段可用性的屬性視窗
如果增益集以 .NET Framework 4 或更新版本為目標,則參考的主要 Interop 組件 (PIA) 內的類型可以內嵌到 VSTO 組件中。
若要檢查 Interop 類型是否會內嵌在您的增益集中,請執行下列步驟:
- 展開 [方案總管] 中的 [參考] 節點。
- 選取其中一個 PIA 參考,例如:Office。
- 按 F4 或從 [組件] 操作功能表中選取 [屬性],以檢視屬性視窗。
- 檢查 [內嵌 Interop 類型] 屬性的值。
如果值設定為 True,則會內嵌類型,而您可以跳到 [建置安裝專案] 區段。
如需詳細資訊,請參閱類型等價和內嵌 Interop 類型
設定啟動條件以偵測 Office PIA 的啟動條件
在 [啟動條件 (OfficeAddInSetup)] 編輯程式中,以滑鼠右鍵按一下 [目標機器上的要求],然後按一下 [新增 Windows Installer 啟動條件]。 此啟動條件會藉由搜尋特定元件識別碼來搜尋 Office PIA。
以滑鼠右鍵按一下 [搜尋 Component1],然後按一下 [屬性視窗] 以顯示啟動條件的屬性。
在 [屬性視窗] 中,設定下列屬性:
- 將 (名稱) 屬性的值更改為 [搜尋 Office 共用 PIA
- 將 [ComponentID] 的值更改為您正在使用之 Office 元件的元件識別碼。 您可以在下表中找到元件識別碼的清單,例如:{64E2917E-AA13-4CA4-BFFE-EA6EDA3AFCB4}。
- 將 [屬性] 屬性的值更改為 HASSHAREDPIA。
在 [啟動條件 (OfficeAddInSetup) 編輯程式中,以滑鼠右鍵按一下 [條件1],然後按一下 [屬性視窗] 以顯示啟動條件的屬性。
更改 [Condition1] 的這些屬性:
- 將 (名稱) 更改為 [驗證 Office 共用 PIA 可用性]。
- 將 [條件] 更改為 HASSHAREDPIA。
- 將 [InstallUrl] 保留空白。
- 將 [訊息] 更改為與 Excel 互動所需的元件不可用。請執行 setup.exe。
圖 10:驗證 Office 共用 PIA 啟動條件的屬性視窗
Microsoft Office 主要 Interop 組件的元件識別碼
主要 Interop 組件 | Office 2010 | Office 2013 | Office 2013 (64 位元) | Office 2016 | Office 2016 (64 位元) |
---|---|---|---|---|---|
Excel | {EA7564AC-C67D-4868-BE5C-26E4FC2223FF} | {C8A65ABE-3270-4FD7-B854-50C8082C8F39} | {E3BD1151-B9CA-4D45-A77E-51A6E0ED322A} | {C845E028-E091-442E-8202-21F596C559A0} | {C4ACE6DB-AA99-401F-8BE6-8784BD09F003} |
InfoPath | {4153F732-D670-4E44-8AB7-500F2B576BDA} | {0F825A16-25B2-4771-A497-FC8AF3B355D8} | {C5BBD36E-B320-47EF-A512-556B99CB7E41} | - | - |
Outlook | {1D844339-3DAE-413E-BC13-62D6A52816B2} | {F9F828D5-9F0B-46F9-9E3E-9C59F3C5E136} | {7824A03F-28CC-4371-BC54-93D15EFC1E7F} | {2C6C511D-4542-4E0C-95D0-05D4406032F2} | {7C6D92EF-7B45-46E5-8670-819663220E4E} |
PowerPoint | {EECBA6B8-3A62-44AD-99EB-8666265466F9} | {813139AD-6DAB-4DDD-8C6D-0CA30D073B41} | {05758318-BCFD-4288-AD8D-81185841C235} | {9E73CEA4-29D0-4D16-8FB9-5AB17387C960} | {E0A76492-0FD5-4EC2-8570-AE1BAA61DC88} |
Visio | {3EA123B5-6316-452E-9D51-A489E06E2347} | {C1713368-12A8-41F1-ACA1-934B01AD6EEB} | {2CC0B221-22D2-4C15-A9FB-DE818E51AF75} | {A4C55BC1-B94C-4058-B15C-B9D4AE540AD1} | {2D4540EC-2C88-4C28-AE88-2614B5460648} |
Word | {8B74A499-37F8-4DEA-B5A0-D72FC501CEFA} | {9FE736B7-B1EE-410C-8D07-082891C3DAC8} | {13C07AF5-B206-4A48-BB5B-B8022333E3CA} | {30CAC893-3CA4-494C-A5E9-A99141352216} | {DC5CCACD-A7AC-4FD3-9F70-9454B5DE5161} |
Microsoft Forms 2.0 | {B2279272-3FD2-434D-B94E-E4E0F8561AC4} | {B2279272-3FD2-434D-B94E-E4E0F8561AC4} | {A5A30117-2D2A-4C5C-B3C8-8897AC32C2AC} | - | - |
Microsoft Graph | {011B9112-EBB1-4A6C-86CB-C2FDC9EA7B0E} | {52DA4B37-B8EB-4B7F-89C1-824654CE4C70} | {24706F33-F0CE-4EB4-BC91-9E935394F510} | - | - |
智慧標籤 | {7102C98C-EF47-4F04-A227-FE33650BF954} | {487A7921-EB3A-4262-BB5B-A5736B732486} | {74EFC1F9-747D-4867-B951-EFCF29F51AF7} | - | - |
Office 共用 | {64E2917E-AA13-4CA4-BFFE-EA6EDA3AFCB4} | {6A174BDB-0049-4D1C-86EF-3114CB0C4C4E} | {76601EBB-44A7-49EE-8DE3-7B7B9D7EBB05} | {68477CB0-662A-48FB-AF2E-9573C92869F7} | {625F5772-C1B3-497E-8ABE-7254EDB00506} |
專案 | {957A4EC0-E67B-4E86-A383-6AF7270B216A} | {1C50E422-24FA-44A9-A120-E88280C8C341} | {706D7F44-8231-489D-9B25-3025ADE9F114} | {0B6EDA1D-4A15-4F88-8B20-EA6528978E4E} | {107BCD9A-F1DC-4004-A444-33706FC10058} |
圖 11:最終啟動條件
您可以進一步精簡 ExcelAddIn 安裝的啟動條件。 例如:檢查是否已安裝實際的目標 Office 應用程式可能很有用。
建置安裝專案
- 在 [方案總管] 中,以滑鼠右鍵按一下 [OfficeAddInSetup] 專案,然後按一下 [建置]。
- 使用 [Windows 總管],瀏覽至 [OfficeAddInSetup] 專案的輸出目錄,並根據選取的組建設定移至 [發行] 或 [偵錯] 資料夾。 將所有檔案從資料夾複製到使用者可以存取的位置。
測試 ExcelAddIn 設定
- 瀏覽至您複製 OfficeAddInSetup 的位置。
- 按兩下 setup.exe 檔案以安裝 OfficeAddInSetup 增益集。 接受任何出現的軟體授權條款,並完成安裝精靈,以在使用者電腦上安裝增益集。
Excel Office 方案應從安裝期間指定的位置安裝並執行。
文件層級方案的其他要求
部署文件層級方案需要 Windows Installer 安裝專案中幾個不同的設定步驟。
以下是部署文件層級方案所需的基本步驟清單:
- 建立 Visual Studio 安裝專案。
- 新增文件層級方案的主要輸出。 主要輸出也包含 Microsoft Office 文件。
- 將部署和應用程式資訊清單新增為鬆散檔案。
- 從安裝程式套件排除相依元件 (任何公用程式元件除外)。
- 設定必要條件套件。
- 設定啟動條件。
- 建置安裝專案,並將結果複製到部署位置。
- 執行安裝程式,在使用者電腦上部署文件層級方案。
- 視需要更新自訂文件屬性。
更改已部署文件的位置
Office 文件內的屬性可用來尋找文件層級方案。 如果文件安裝到與 VSTO 組件相同的資料夾,則不需要進行任何變更。 不過,如果它安裝到不同的資料夾,則必須在安裝過程中更新這些屬性。
如需這些文件屬性的詳細資訊,請參閱自訂文件屬性概觀。
若要變更這些屬性,您必須在安裝期間使用自訂動作。
下列範例使用名為 ExcelWorkbookProject 的文件層級方案,以及名為 ExcelWorkbookSetup 的安裝專案。 除了設定登錄機碼之外,ExcelWorkbookSetup 專案是使用上述相同步驟來設定。
將自訂動作專案新增至 Visual Studio 方案
以滑鼠右鍵按一下 [方案總管] 中的 [Office 文件部署專案],將新的 .NET 控制台專案新增至方案
展開 [新增],然後按一下 [新增專案]。
選取主控台應用程式範本,並將專案命名為 AddCustomizationCustomAction。
圖 12:方案總管 - AddCustomizationCustomAction
新增這些組件的參考:
- System.ComponentModel
- System.Configuration.Install
- Microsoft.VisualStudio.Tools.Applications
- Microsoft.VisualStudio.Tools.Applications.ServerDocument
將此程式碼複製到 Program.cs 或 Program.vb
using System;
using System.IO;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using Microsoft.VisualStudio.Tools.Applications;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
namespace AddCustomizationCustomAction
{
[RunInstaller(true)]
public class AddCustomizations : Installer
{
public AddCustomizations() : base() { }
public override void Install(IDictionary savedState)
{
base.Install(savedState);
//Get the CustomActionData Parameters
string documentLocation = Context.Parameters.ContainsKey("documentLocation") ? Context.Parameters["documentLocation"] : String.Empty;
string assemblyLocation = Context.Parameters.ContainsKey("assemblyLocation") ? Context.Parameters["assemblyLocation"] : String.Empty;
string deploymentManifestLocation = Context.Parameters.ContainsKey("deploymentManifestLocation") ? Context.Parameters["deploymentManifestLocation"] : String.Empty;
Guid solutionID = Context.Parameters.ContainsKey("solutionID") ? new Guid(Context.Parameters["solutionID"]) : new Guid();
string newDocLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), Path.GetFileName(documentLocation));
try
{
//Move the file and set the Customizations
if (Uri.TryCreate(deploymentManifestLocation, UriKind.Absolute, out Uri docManifestLocationUri))
{
File.Move(documentLocation, newDocLocation);
ServerDocument.RemoveCustomization(newDocLocation);
ServerDocument.AddCustomization(newDocLocation, assemblyLocation,
solutionID, docManifestLocationUri,
true, out string[] nonpublicCachedDataMembers);
}
else
{
LogMessage("The document could not be customized.");
}
}
catch (ArgumentException)
{
LogMessage("The document could not be customized.");
}
catch (DocumentNotCustomizedException)
{
LogMessage("The document could not be customized.");
}
catch (InvalidOperationException)
{
LogMessage("The customization could not be removed.");
}
catch (IOException)
{
LogMessage("The document does not exist or is read-only.");
}
}
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
DeleteDocument();
}
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
DeleteDocument();
}
private void DeleteDocument()
{
string documentLocation = Context.Parameters.ContainsKey("documentLocation") ? Context.Parameters["documentLocation"] : String.Empty;
try
{
File.Delete(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), Path.GetFileName(documentLocation)));
}
catch (Exception)
{
LogMessage("The document doesn't exist or is read-only.");
}
}
private void LogMessage(string Message)
{
if (Context.Parameters.ContainsKey("LogFile"))
{
Context.LogMessage(Message);
}
}
static void Main() { }
}
}
若要將自訂新增至文件,您必須擁有 VSTO 文件層級方案的方案識別碼。 此值是從 Visual Studio 專案檔案擷取。
擷取方案標識碼
在 [建置] 功能表上,按一下 [建置方案] 以建置文件層級方案,並將方案標識碼屬性新增至專案檔案。
在 [方案總管] 中,以滑鼠右鍵按一下文件層級專案 [ExcelWorkbookProject]
按一下 [UnloadProject] 以從 Visual Studio 內部存取專案檔案。
圖 13:卸載 Excel 文件方案
在 [方案總管] 中,以滑鼠右鍵按一下 [ExcelWorkbookProject],然後按一下 [EditExcelWorkbookProject.vbproj] 或 [Edit ExcelWorkbookProject.csproj]。
在 [ExcelWorkbookProject] 編輯程式中,找出 [PropertyGroup] 元素內的 [SolutionID] 元素。
複製這個元素的 GUID 值。
圖 14:擷取 SolutionID
在 [方案總管] 中,以滑鼠右鍵按一下 [ExcelWorkbookProject],然後按一下 [重新載入專案]。
在出現的對話方塊中,按一下 [是],以關閉 [ExcelWorkbookProject] 編輯程式。
[安裝自訂動作] 中將會使用 [方案識別碼]。
最後一個步驟是設定 [安裝] 和 [卸載] 步驟的自訂動作。
設定安裝專案
在 [方案總管] 中,以滑鼠右鍵按一下 [ExcelWorkbookSetup],展開 [新增],然後按一下 [專案輸出]。
在 [新增項目輸出群組] 對話方塊的 [專案] 清單中,按一下 [AddCustomizationCustomAction]。
選取 [主要輸出],然後按一下 [確定] 關閉對話方塊,並將包含自訂動作的組件新增至安裝專案。
圖 15:文件資訊清單自訂動作 - 新增專案輸出群組
在 [方案總管] 中,以滑鼠右鍵按一下 [ExcelWorkbookSetup]。
展開 [檢視],然後按一下 [自訂動作]。
在 [自訂動作 (ExcelWorkbookSetup)] 編輯程式中,以滑鼠右鍵按一下 [自訂動作],然後按一下 [新增自訂動作]。
在 [選取專案的項目] 對話方塊中,按一下 [查詢] 清單中的 [應用程式資料夾]。 選取 [AddCustomizationCustomizationCustomAction 的主要輸出],然後按一下 [確定] 將自訂動作新增至 [安裝] 步驟。
在 [安裝節點] 中,以滑鼠右鍵按一下 [AddCustomizationCustomAction(Active) 的主要輸出],然後按一下 [重新命名]。 將自訂動作命名為 [將文件複製到我的文件並附加自訂]。
在 [解除安裝節點] 中,以滑鼠右鍵按一下 [AddCustomizationCustomAction(Active) 的主要輸出],然後按一下 [重新命名]。 將自訂動作命名為 [從文件資料夾移除文件]。
圖 16:檔案資訊清單自訂動作
在 [自訂動作 (ExcelWorkbookSetup)] 編輯程式中,以滑鼠右鍵按一下 [將文件複製到我的文件並附加自訂],然後按一下 [屬性視窗]。
在 [CustomActionData] 屬性 視窗中,輸入自訂 DLL 的位置、部署資訊清單,以及 Microsoft Office 文件的位置。 也需要 SolutionID。
如果您想要將任何安裝錯誤記錄至檔案,請包含 LogFile 參數。 s
/assemblyLocation="[INSTALLDIR]ExcelWorkbookProject.dll" /deploymentManifestLocation="[INSTALLDIR]ExcelWorkbookProject.vsto" /documentLocation="[INSTALLDIR]ExcelWorkbookProject.xlsx" /solutionID="Your Solution ID" /LogFile="[TARGETDIR]Setup.log"
圖 17:將文件複製到我的文件的自訂動作
解除安裝的自訂動作需要文件的名稱,您可以透過在 CustomActionData 中使用的相同 documentLocation 參數來提供名稱
/documentLocation="[INSTALLDIR]ExcelWorkbookProject.xlsx"
編譯和部署 ExcelWorkbookSetup 專案。
查看 [我的文件] 資料夾,然後開啟 ExcelWorkbookProject.xlsx 檔案。
其他資源
如何:安裝 Visual Studio Tools for Office Runtime
Office Primary Interop Assemblies
關於作者
Wouter van Vugt 是一個擁有 Office Open XML 技術的 Microsoft MVP,也是一位獨立顧問,專注於使用 SharePoint、Microsoft Office 和相關 .NET 技術建立 Office 商務應用程式 lications (OBA)。 Wouter 經常為 MSDN 等開發人員社群網站撰稿。 他發表了多篇白皮書和文章,也出版一本名為「Open XML:Explained」的電子書。 Wouter 是 Code-Counsel 的創辦人,這是一家荷蘭公司,專注於透過各種管道提供先進技術內容。 您可以閱讀 Wouter 的部落格來了解更多關於他的資訊。
Ted Pattison 是 SharePoint MVP、作者、培訓師和 Ted Pattison Group 的創辦人。 2005 年秋天,Microsoft 開發人員平台推廣小組聘請 Ted,為 Windows SharePoint Services 3.0 和 Microsoft Office SharePoint Server 2007 撰寫 Ascend 開發人員訓練課程。 從那時候起,Ted 就一直專注於教育 SharePoint 2007 技術的專業開發人員。 Ted 已為 Microsoft Press 撰寫一本名為 Inside Windows SharePoint Services 3.0 的書,著重於介紹如何使用 SharePoint 做為建置業務解決方案的開發平台。 Ted 也為 MSDN 雜誌撰寫了標題為 Office Space 的專欄,內容以開發人員為中心。