VS2005 安裝部署

<script type="text/javascript"> // </script> 8 部署應用程序

本章內容:

作爲一名應用程序開發人員,您一定了解部署應用程序的難度。正因爲如此,當您在 Microsoft Visual Studio 2005 中看到用於部署應用程序的新工具和改進的工具時,會感到無比驚喜。在本章中,您將特別專注於如何使用新的 ClickOnce 部署技術。而且還將回顧如何使用 Visual Studio 2005 中包含的設置項目模板和工具來構建 Microsoft Windows Installer 包。同時,作爲一名 Microsoft Visual Basic .NET 應用程序開發人員,您還將學習在面對各種特定情況時,如何選擇正確的方法來部署應用程序。

*

本頁內容

應用程序:使用 ClickOnce 進行用戶啓動的更新

應用程序:使用 ClickOnce 進行用戶啓動的更新

新概念

新概念

背景

背景

代碼訪問安全性

代碼訪問安全性

ClickOnce 的優點

ClickOnce 的優點

發佈 ClickOnce 應用程序

發佈 ClickOnce 應用程序

安裝和運行 ClickOnce 應用程序

安裝和運行 ClickOnce 應用程序

更新 ClickOnce 應用程序

更新 ClickOnce 應用程序

配置 ClickOnce 屬性

配置 ClickOnce 屬性

ClickOnce 安全性

ClickOnce 安全性

運行在沙箱中的 ClickOnce 應用程序

運行在沙箱中的 ClickOnce 應用程序

配置 ClickOnce 代碼訪問安全性

配置 ClickOnce 代碼訪問安全性

權限計算器

權限計算器

在安全區域中進行調試

在安全區域中進行調試

提升權限

提升權限

改進的安全策略模型

改進的安全策略模型

Windows Installer 增強功能

Windows Installer 增強功能

演練

演練

小結

小結

應用程序:使用 ClickOnce 進行用戶啓動的更新

此應用程序演示如何使用 ClickOnce 應用程序編程接口 (API) Windows 窗體應用程序添加用戶啓動的更新功能。

返回頁首返回頁首

新概念

Visual Studio 2005 中,有三個可選的主要部署選項:WebClickOnce Windows Installer 包。使用 MS-DOS XCopy 命令將應用程序文件從一個地方移動到另一個地方是另一種選項,它仍然是最簡單、最直接的部署方法。它也最不靈活,實際上只適用於幾種情況例如,當更新 Web 應用程序(即使它應該只適合於不需要更新 IIS 元數據庫的部署)或用於安裝私有 .NET 程序集的情況。

ClickOnce Visual Studio 2005 中引入的一種集成部署技術,允許從 Web 服務器安裝和運行 Windows 應用程序,而幾乎沒有與用戶進行交互。作爲 Microsoft Windows Server 2003Windows XPWindows 2000 Windows Me 附帶的一部分,Windows Installer是一項安裝和配置服務(作爲單獨的下載內容,它還可用於 Windows 9x Windows NT 4.0)。您將發現,在 Visual Studio 2005 中構建於 Windows Installer 基礎上的部署工具爲提供了豐富的功能,可以快速部署和更新應用程序。

返回頁首返回頁首

背景

組成 ClickOnce 的服務集合體現了這些技術的發展,.NET Framework 的第一版中開始出現一種稱爲非接觸部署(No-Touch) 的技術。在 .NET Framework 1.0 版發佈時,它馬上就解決了開發人員面臨的許多問題。在 .NET Framework 上構建的託管應用程序得益於應用程序隔離和低影響部署(也稱爲 XCopy 部署)。通過提供一種共享組件和對組件進行版本控制的新方法,.NET Framework 1.0 還更正了“DLL Hell”問題(即安裝將破壞現有的軟件,並有可能破壞將來的軟件安裝)。消除了 DLL 的版本問題,也就爲思考部署 Windows 桌面應用程序的新方法打開了一扇大門,與基於 Web 的應用程序相比,Windows 桌面應用程序可以提供更多的功能,並且可以提供更豐富的用戶體驗。

非接觸部署作爲一種基於 Web 的部署方法而出現,它允許安裝 Internet Explorer 5.01 或更高版本的用戶從某個 URL 下載和安裝 Windows 桌面應用程序,並在其本地計算機上運行它們,而無需運行通常的 Setup.exe。該部署機制還稱爲“href-exes”,它將桌面應用程序的豐富功能與 Web 應用程序部署的簡單性結合起來。

遺憾的是,直接從 Web 位置運行應用程序也存在侷限性。首先,由 Web 頁啓動的應用程序僅在聯機時可用,因此受網絡連接的影響,這是由它們的本質決定的。href-exes 的另一個重要問題是其安全性問題。應用程序要運行,更有可能要求更改客戶端上的默認安全策略。在 Visual Studio 的早期版本中,開發人員在設計時幾乎不可能確定應用程序所需的權限。毫無疑問,許多非接觸部署被不可預見的安全限制巨石所擊碎,使得這些部署不能用於生產中。非接觸部署的另一個侷限性是,它沒有提供管理版本發佈的標準機制。

ClickOnce 可以保護用戶的計算機和應用程序。當 ClickOnce 下載和安裝程序時,它不會更改自身文件以外的任何文件。可以設置更新策略,並利用 .NET Framework 版本控制機制來管理更新。在本節中,您將看到一個應用程序,它闡釋如何使用 ClickOnce 部署 API 允許用戶自動更新 Windows 桌面應用程序。但在研究該實現的細節之前,我們來回顧一下 ClickOnce 的新功能,以及在必須從中選擇的部署功能的範圍內,它如何適合於 Visual Studio 2005。您還將詳細瞭解到,以聲明方式實現 ClickOnce 部署和自動更新是多麼簡單。

當我們討論 ClickOnce 的安全性時,您將會更詳細地瞭解到,Visual Studio 2005 IDE 中提供的工具使得無需推測計算和配置分佈式 Web 胖客戶端應用程序的安全需求。這是朝實現非接觸部署的早期承諾邁進的一大步。

返回頁首返回頁首

代碼訪問安全性

代碼訪問安全性 (CAS) 是公共語言運行庫 (CLR) 的一種功能,它基於代碼的標識執行安全性。作爲一名開發人員,您可能並沒有將使用 CAS 作爲日常事務的一部分,因爲保證代碼安全的基礎結構內置於 .NET Framework 庫中。然而,爲了做出關於應用程序安全需求的正確決策,瞭解 CAS 非常必要特別是 .NET Framework 如何處理證據、權限和代碼組。同樣非常重要的是,在開發項目的生命週期中,通常是在早期解決安全問題。詳盡地討論 CAS 超出了本書的範圍。要了解更多信息,請訪問 MSDN Web 站點(請參見 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcodeaccesssecurity.asp),該站點包含許多有關常見安全問題的文章,特別是有關 CAS 的文章;也可以閱讀專門論述 .NET Framework 安全性的書籍,例如 Writing Secure Code, 2nd Edition, by Michael Howard and David LeBlanc (Microsoft Press, 2003) .NET Framework Security, by Brian A. LaMacchia, et al. (Addison-Wesley, 2002)

返回頁首返回頁首

ClickOnce 的優點

ClickOnce 構建於此前的早期計劃的基礎上,旨在於解決許多與其他部署方法相關的障礙。

自動/自助服務更新 非接觸部署引入桌面應用程序基於 Web 的安裝。ClickOnce 擴展了這種功能,提供一種自動更新應用程序或允許用戶根據自己的判斷來更新應用程序的機制。無需用戶重新安裝整個應用程序也可以應用更新。

獨立應用程序爲了避免有時發生與使用共享組件的應用程序相關的版本衝突,ClickOnce 將應用程序部署爲一個獨立的實體,該實體不會影響其他應用程序。即,通過 ClickOnce 安裝的應用程序不會被以後的應用程序安裝破壞。

非管理員安裝只有具有管理員權限時才能運行 Windows Installer 應用程序。具有較低權限的帳戶可以安裝 ClickOnce 應用程序,而且只授予它們運行該應用程序所需的權限。

脫機訪問通過 ClickOnce 部署的應用程序可以安裝爲聯機運行或本地運行。在後一種情況中,它們與 Windows Shell 集成在一起,包括爲應用程序添加一個“Start”菜單快捷方式。這樣就可以隨時隨地訪問 Web 部署的應用程序。

對於 .NET Framework 1.0 1.1 版本,Microsoft .NET提供了更新應用程序塊,作爲進一步擴展非接觸部署優點的一種方法。該應用程序塊由 Microsoft 模式與實踐小組開發和發佈,可以從 MSDN 免費下載,它包含文檔和自定義 .NET 程序集(帶有源代碼),供開發人員爲應用程序添加自助更新功能。(請參見 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/updater.asp。)

在資金、時間和精力方面,ClickOnce 部署也提供了非常高的成本效益。設想一下,這些節約下來的投入肯定能對應用程序設計中的關鍵決策點產生影響:由於需要一種方式來輕鬆地將應用程序提供給廣大用戶,並需要能夠快速而簡單地更新該應用程序,您已經多少次將解決方案構建爲基於 Web 的應用程序?如果您是一名在託管網絡環境中工作的開發人員,那麼您將面臨網絡管理員帶來的其他障礙他們不願意或不會支持部署更新,而該部署更新又要求在網絡上的每個客戶端系統中運行安裝程序。

說到底,將解決方案構建爲基於 Web 的應用程序是最順暢的方式,這有幾個很充分的理由。雖然犧牲了高級功能和豐富的用戶界面,但部署和更新 Web 應用程序將更容易、更經濟且更爲輕鬆。ClickOnce 使得不需要在功能和容易部署之間進行折衷,因爲它爲胖客戶端應用程序提供了簡單和可靠的 Web 應用程序部署方式。

所有這些都表明,基於 Web 的應用程序將不會過時。它們仍可以爲需要在各種操作系統上運行的解決方案提供無所不及的功能。對於完全功能的客戶端安裝,Windows Installer 包依然是最佳選擇。但是,在許多情況下,開發人員現在有望將胖客戶端應用程序提供給用戶,而無需面對部署約束,而在過去,這些約束使得這種部署方式成爲一種不切實際的選擇。

作爲其核心,ClickOnce 是內置於 .NET CLR 中的一組新部署功能。這些功能包括一個可編程的界面,以及集成在 Visual Studio 2005 IDE 中的設計時支持。此外,還可以將 ClickOnce 部署功能直接內置於應用程序本身中,而不需要構建一個單獨的安裝程序。

返回頁首返回頁首

發佈 ClickOnce 應用程序

ClickOnce 技術集成在 Visual Studio 2005 IDE 中的兩個主要部分。第一部分是“Build”菜單,它包含一個“Publish”菜單項。同樣的命令在解決方案資源管理器中的解決方案和項目上下文菜單中也可用。Visual Studio 2005 IDE 中的第三個發佈選項使用命令按鈕,該命令按鈕在項目設計器的“Publish”窗格中可用。(這表示 Visual Studio 2005 IDE ClickOnce 集成的第二個主要部分。)選擇“Publish”菜單命令(或單擊“Publish”窗格中的“Publish Wizard”按鈕)將啓動“Publish Wizard”(如圖 8-1 所示),這種工具可指導您完成發佈所需的步驟。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_05_0001.jpg

8-1 發佈嚮導。

發佈嚮導的第一頁要求選擇應用程序的位置。該向導的其他步驟同樣允許更改其他部署設置(例如,安裝模式和用戶安裝應用程序的方式,以及選擇簽名應用程序和部署清單所需的公鑰/私鑰)。如果需要更改,請單擊“Next”按鈕,使嚮導前進一步。完成更新設置後,單擊“Finish”

部署清單是一個描述 ClickOnce 應用程序部署的 XML 文件,包括部署的當前版本、更新配置設置,以及最重要的 ClickOnce 應用程序的應用程序清單的當前版本。

應用程序清單是一個標識利用 ClickOnce 部署的應用程序的 XML 文件,包括標識應用程序的主要程序集、它的安全需求、應用程序使用的非程序集文件列表,以及應用程序運行所需的任何依賴項。

當首次發佈應用程序時,Visual Studio 2005 在名爲 publish 的解決方案中創建一個新文件夾,並將安裝應用程序所需的文件存儲在該目錄中,包括部署清單和包含應用程序先決條件的引導程序。它還生成一個帶有指向程序安裝和先決條件的鏈接的 Web 頁。如果將某個 Web 站點指定爲發佈的位置,ClickOnce 發佈引擎就在目標 Web 服務器上創建一個虛擬目錄,並將文件從本地發佈文件夾複製到該位置。最後,ClickOnce Web 瀏覽器中打開一個發佈頁,如圖 8-2 所示。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_06.jpg

8-2 發佈頁。

返回頁首返回頁首

安裝和運行 ClickOnce 應用程序

如果部署應用程序是爲了脫機使用(這是默認的安裝模式),單擊應用程序鏈接就可以開始在用戶的計算機上安裝應用程序。如果將應用程序配置爲只可聯機使用,那麼將直接從發佈頁啓動它。圖 8-3 顯示當嘗試安裝應用程序時接收到的安全確認消息。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_06_0002.jpg

8-3 安裝確認對話框。

用戶單擊Install按鈕後,應用程序就安裝在用戶計算機上的一個本地文件夾中。安裝成功後,ClickOnce 子系統會自動從本地安裝目錄運行此應用程序。

返回頁首返回頁首

更新 ClickOnce 應用程序

將更新傳遞給應用程序的過程與發佈應用程序原始版本的過程相同。發佈更新之前唯一要做的事情就是增加應用程序的版本號。可以自動或手動增加發布版本號。默認情況下,將發佈版本設置爲每次發佈應用程序就自動增加修訂號。但是,如圖 8-4 所示,可以清除“Automatically Increment Revision With Each Release”複選框來手動設置該值。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_07.jpg

8-4 發佈版本。

發佈版本和應用程序程序集的版本號完全無關,注意到這一點非常重要。如果將應用程序配置爲每次發佈自動增加版本號,那麼對於發佈 ClickOnce 應用程序的新版本而言,最容易的方法是單擊項目設計器中“Publish”窗格中的“Publish Now”按鈕。發佈子系統編譯更新的應用程序,並將程序集和與其相關的應用程序清單存儲在發佈位置的一個新文件夾中。它還更新部署清單以指向新的應用程序清單。下次用戶打開應用程序時(並假定將應用程序配置爲檢查更新),用戶計算機上的 ClickOnce 運行時會發現新版本,然後通知用戶更新可用或自動安裝更新。

8-5 顯示了一個典型的更新通知對話框。在該示例中,可以選擇安裝應用程序的更新版本或跳過更新。在 ClickOnce 應用程序的更新配置設置中,可以控制用戶是否可以選擇拒絕更新。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_08.jpg

8-5 更新通知。

爲了更好地理解 ClickOnce 應用程序如何獲知應用程序的更新可用時間,可以研究圖 8-6 所示的文件和文件夾。該圖闡釋一種典型的更新情況,即存儲在 WeatherReport_1.0.0.0 文件夾中的應用程序的原始版本已經由存儲在 WeatherReport_1.0.0.1 文件夾中的更新的版本進行更新。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_082.jpg

8-6 已發佈的應用程序文件。

部署清單(圖 8-6 中所示的WeatherReport.application 文件)包含一個應用程序最新版本的條目。當應用程序檢查更新時,ClickOnce 查看部署清單,並將其與應用程序的當前版本進行比較。如果可用版本比應用程序的當前版本更新,則 ClickOnce 或者顯示一條提示消息來通知用戶更新可用,或者自動更新應用程序,這取決於您如何配置更新應用程序設置。

8-7 闡釋這個過程。服務器包含應用程序原始版本和更新版本 (1.0.0.1) 的應用程序文件。部署清單顯示,應用程序有一個更新的版本可用。當已安裝的應用程序執行更新檢查時,它將閱讀部署清單,並瞭解是否有一個更新可用。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_08_0003.jpg

返回頁首返回頁首

配置 ClickOnce 屬性

雖然默認的 ClickOnce 設置在有些情況下是適合的,但您需要熟悉項目設計器的“Publish”窗格,以控制不同的部署方案。“Publish”窗格中的設置允許您配置高級部署選項,配置各種更新方案,爲 ClickOnce 應用程序添加先決條件,並管理在應用程序清單中如何處理應用程序自身中包含的文件。

有關 Visual Studio 2005 項目設計器的詳細信息,請參閱第 3 “Visual Studio 2005 集成開發環境

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_09_0001.jpg

8-8 項目設計器的“Publish”窗格。

Deployment Manifest

Version = 1.0.0.1

Application

Version = 1.0.0.0

Application

.0.0.0

Application

.0.0.1

發佈位置

發佈位置可以是一個 Web 站點、FTP 站點、文件共享或指向磁盤的路徑。如果旨在將應用程序分佈在可移動的介質(例如 CD),則選擇磁盤路徑是一種合適的選擇。在目標 Web 服務器沒有配置爲使用 Microsoft Front Page 服務器擴展(發佈到 Web 站點要求這樣做)的情況下,使用網絡文件共享或 ftp 服務器作爲發佈位置是一個不錯的選擇。

如果安裝 URL 不同於發佈位置,則在“Publish”窗格的“Installation URL”文本框中指定該地址。例如,如果發佈到一個內部 Web 站點,而且該應用程序是供 Internet 用戶使用的,那麼這將是指定外部地址的地方。需要指定單獨安裝 URL 的另一種情況是:發佈位置是一個文件共享或 ftp 服務器。

通過在“Publish”窗格包含的“Documentation And Support URL”文本框中設置 URL,還可以包含對以下二者的引用:應用程序的基於 Web 的幫助或其他支持文檔。如果爲該屬性輸入地址,那麼它將作爲發佈應用程序時生成的發佈頁上的一個鏈接出現。

安裝模式

安裝模式將部署定義爲已安裝應用程序或已啓動應用程序。表 8-1 總結每種選項的主要特點。

8-1 安裝模式選項

已安裝

已啓動

WebCD/DVD 或網絡共享進行安裝

直接從 Web 或網絡共享運行

Shell 集成(“Start”菜單出現時,添加到“Add or Remove Programs”的條目)

沒有 shell 集成

脫機可用 僅聯機可用

各種應用程序更新策略始終運行最新版本的應用程序。

ClickOnce 安裝的應用程序與按照傳統方式安裝的 Windows 應用程序具有相同的基本屬性。ClickOnce 將程序快捷方式添加到“Start”菜單,而應用程序出現在本地的“Add or Remove Programs”小程序中,因此,它可以像其他程序一樣卸載,也可以回滾到以前的版本。

可以在發佈嚮導或項目設計器的“Publish”窗格中設置安裝模式。在“Publish”窗格中,標題爲“Install Mode And Settings”的部分包括兩個選項。選擇其中一個選項:

應用程序只能聯機使用

應用程序也可以脫機使用

對版本回滾的支持僅限於 ClickOnce 應用程序以前的一個版本。

ClickOnce 啓動的應用程序從其發佈的 Web 頁執行。這使其感覺更像 href-exe — “Start”菜單上沒有添加 href-exe 的快捷方式,應用程序也未出現在“Add or Remove Programs”中。然而,雖然對於用戶而言,以這種方式部署的應用程序好像是從源 Web 位置運行的,但它們實際上以與 Web 頁緩存相似的方式在本機上緩存,兩者的目標同樣都是降低網絡流量以提高應用程序的性能。這種類型的應用程序緩存起初是隨非接觸部署引入的,其中的可執行應用程序下載到本地計算機的程序集下載緩存中。

發佈選項

Publish”窗格的“Install Mode And Settings”部分包括 4 個按鈕控件,用於訪問操作其他發佈屬性的對話框。如果單擊最底端的按鈕“Options”,將打開“Publish Options”對話框,如圖 8-9 所示。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_11_0001.jpg

8-9 “Publish Options”對話框。

發佈語言Publish Language 屬性控制 ClickOnce 應用程序安裝過程中顯示的用戶界面項的語言。如果該屬性設置爲 Default,則安裝使用用戶計算機上的區域與語言設置。如果正在發佈本地化版本的 ClickOnce 應用程序,那麼將該屬性更改爲與應用程序本地化設置相匹配的語言和區域。

開始菜單名稱如上所述,本地安裝的應用程序具有 Windows 外殼程序集成,它會出現在“Start”菜單上。可以在“Start Menu Shortcut Resource Name”文本框中爲應用程序指定出現在“Start”菜單項中的名稱。如果該屬性保留爲空白,ClickOnce 將使用基礎應用程序程序集的標題。

發佈頁當發佈第一版的 ClickOnce 應用程序時,發佈引擎創建一個名爲 publish.htm. HTML 頁。該頁顯示了 ClickOnce 應用程序的名稱、安裝應用程序的鏈接、所有先決條件(如果指定)或支持的文檔,以及指向 MSDN ClickOnce 幫助主題的鏈接。作爲發佈過程的一部分,該頁與 ClickOnce 應用程序文件一起復制到發佈位置。

如果發佈後續版本的應用程序,將不改寫發佈頁面。這意味着在發佈該頁面後,可以利用任何 HTML 編輯器自定義頁面,而無需擔心以後丟失這些更改。

“Publish Options”對話框允許更改發佈頁的默認名稱 publish.htm。發佈後通過清除“Automatically Open This Page On Publishing”複選框,還可以禁止在 Web 瀏覽器中打開該頁面。

部署策略票證如果計劃在託管網絡中部署應用程序(例如,如果您是一位在 Intranet 上部署應用程序的公司開發人員),那麼可以使用 ClickOnce 進行所謂的可信應用程序部署,它描述一種用於安全而可靠地部署應用程序的模型,要求高級別的信任而不必提示用戶。通過將 ClickOnce 部署策略發佈到將特定應用程序發佈者定義爲可信任的客戶端,組織內的系統管理可以啓用這種類型的部署。(這些發佈者也稱爲信任頒發者。)一旦安裝了這一策略,由這些發行商之一簽署的任何 ClickOnce 應用程序都可以接收更高級別的信任。

可信應用程序部署對於非託管網絡的部署不可行。相反,必須使用權限提升,本章的“ClickOnce 安全性一節將對此進行詳細討論。

作爲應用程序開發人員,需要執行下列兩個基本步驟來利用該安全模型:

1.

從組織的信任許可證頒發商處獲得信任許可證文件 (.tlic),並將其添加到您的項目中。

2.

ClickOnce 應用程序的 Deployment Policy Ticket 屬性設置爲信任許可證文件。

將信任許可證文件添加到項目後,可以使用“Publish Options”對話框選擇 Deployment Policy Ticket 屬性。許可證文件將出現在對話框提供的下拉列表中。

有關安全策略管理和創建信任許可證的詳細討論超出了本書的範圍。有關這些主題的詳細信息,請參見 MSDN 技術資源庫中有關 Visual Studio 2005 的內容。

確定應用程序更新需求

在部署第 1 版應用程序之前,應仔細考慮更新需求,因爲在發佈版本 2 時,您所做的選擇將會起作用。例如,如果將第 1 版的 ClickOnce 應用程序配置爲應用程序運行時在後臺檢查更新,那麼,當準備版本 2 的應用程序時,決定要在應用程序啓動之前檢查更新,則這種更改將直到版本 2 成功安裝後纔可應用。

或者提出我需要用戶始終擁有最新版本的應用程序嗎?這樣的問題,考慮如何處理通用的更新方案。根據特定應用程序針對此問題的回答,可以選擇一種能夠靈活提供更新的更新策略,或使用一種更加嚴格的方法,以確保用戶始終擁有最新版本的應用程序。

默認情況下,當應用程序運行時,ClickOnce 應用程序在後臺查找更新。如果更新實際可用,那麼下次用戶運行該應用程序時,將出現一個提示詢問她是否安裝此更新。這是一個相當靈活的更新方法的示例,因爲在發現更新後,用戶繼續使用該應用程序。可以將這種行爲更改爲在應用程序啓動之前檢查更新。在這種情況下,當更新可用時,在應用程序運行 將出現更新提示。這種方法仍然允許用戶控制是否安裝更新,但至少在應用程序運行之前使其有機會進行決策。

配置自動更新選項

儘管在某些情況下,提示用戶這一功能運行良好,但在強制更新的情況下,會出現其他問題。一個顯而易見的的例子就是,如果應用程序將數據發送給服務器,之後在服務器端更改了數據模型;而過時的客戶端就有向服務器發送錯誤數據的風險。可以通過將應用程序配置爲自動更新來解決這個問題,如以下步驟所述:

1.

單擊項目設計器Publish”窗格的“Updates”按鈕。這將打開“Application Updates”對話框,如圖 8-10 所示。

2.

選中“Application Should Check For Updates”複選框。

3.

要選擇應用程序應該何時檢查更新,可以選擇“Before The Application Starts”

4.

清除“Allow The Users To Choose Whether To Accept The Update”複選框。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_14.jpg

8-10 “Applications Updates”對話框。

請記住,配置應用程序更新僅對於本地安裝的 ClickOnce 應用程序是必需的。如果將應用程序配置爲聯機啓動,則更新就定義爲自動提供(即,其工作方式與 Web 頁更新的方式完全相同)。

設置更新檢查間隔

除非爲其他配置,否則支持 ClickOnce 的應用程序在每次運行時都要檢查更新。可以將這種行爲更改爲指定的時間間隔例如,每兩週一次。如果應用程序不要求用戶立即接收最新的應用程序更新,那麼這就是一個明智的選擇。如果還需要實現用戶啓動的更新以允許用戶檢查應用程序本身是否有更新,那麼將自動更新檢查設置爲較長的時間間隔是一種不錯的選擇。(稍後在本章的演練一節中,將看到如何實現用戶啓動的更新檢查。)

考慮帶寬

ClickOnce 應用程序使用的網絡連接的質量是確定檢查更新策略時應當考慮的一個因素。如果網絡的帶寬較高,那麼在應用程序啓動之前檢查更新比較適合。另一方面,如果網絡很慢,這會導致應用程序加載非常慢。在這種情況下(如果用戶能夠接受臨時使用應用程序的過時版本),一種較好的選擇是在應用程序運行時檢查更新,以允許 .NET Framework 在後臺線程中執行更新檢查。

應用程序先決條件

ClickOnce 應用程序運行之前,要求在計算機上安裝 .NET Framework 的正確版本。另外,和標準的安裝程序一樣,ClickOnce 應用程序可能需要其他的軟件組件。例如,如果應用程序使用最新版本的 Microsoft 數據訪問組件 (MDAC) Microsoft DirectX,那麼可以將它們作爲單獨的安裝程序包含在 ClickOnce 部署中,並與 ClickOnce 應用程序一起發佈。提供應用程序先決條件的單獨安裝程序通常稱爲引導。引導程序具有以下主要功能:

它是隻安裝目標機上所需組件的輕量級安裝程序。

它支持標準安裝 EXE Windows Installer 安裝包(.msi 文件)。

它支持自動重新啓動和恢復。

可以很容易地將可重新發布的包添加到可用先決條件列表中。

引導程序將 ClickOnce 和更緊湊的軟件安裝聯繫起來。引導程序在企業設置中也是有用的,其中各種不同的應用程序共享內部構建的 .NET 組件,並需要將這些組件安裝在全局程序集緩存 (GAC) 中。因爲 ClickOnce 應用程序文件只能安裝到本地應用程序緩存,所以發往 GAC 的程序集必須利用添加到應用程序先決條件的 Windows Installer 安裝包(.msi 文件)來安裝。需要牢記的是:引導程序要求 Full Trust 權限。您的用戶將需要管理權限來安裝包含在引導程序中的組件,而與 ClickOnce 應用程序本身指定的安全級別無關。

要配置哪些安裝組件包括在引導程序中,可以使用“Prerequisites”對話框,它提供一組可用的可重新發布包。(請參見圖 8-11。)默認情況下,Microsoft .NET Framework 2.0 可重新發行包 (Dotnetfx.exe) 是預先選擇的。這是一個引導程序實用工具,如果它沒有出現在用戶的計算機上,則可自動下載並安裝 .NET Framework。對話框允許您選擇從與應用程序(默認的)相同的位置處下載先決條件,或者指定另一個下載位置。如果組織使用一組共同的先決條件,並且希望在部署服務器上保留磁盤空間,此外還要確保每個應用程序接收相同版本的先決條件,那麼使用不同的位置是一個不錯的選擇。

先決條件是可擴展的可以將您自己的 Windows Installer .msi 文件或其他第三方可重新發布包添加到引導程序中。有關詳細信息,請參閱 MSDN 技術資源庫中有關 Visual Studio 2005 的文章“How to:Add Your Own Prerequisites to a ClickOnce Application”

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_16_0001.jpg

8-11 “Prerequisites”對話框。

當發佈應用程序時,先決條件被捆綁到引導程序的安裝程序中。最終的發佈 Web 頁包含用於安裝 ClickOnce 應用程序和引導程序的單獨鏈接。

警告先決條件不能使用 ClickOnce 的自動更新功能進行更新。只有應用程序本身才可進行更新。

應用程序文件

發佈一個 ClickOnce 應用程序時,項目中的所有文件與應用程序一起發佈。在有些情況下,項目可能包含開發所需的文件,但您不想將它們包含在部署中。在其他情況下,您可能想指定某些文件只能根據可控條件進行安裝,從而使應用程序的性能和安裝時間達到最佳的程度。使用“Publish”窗格中的“Application Files”對話框,可以排除文件,將文件標記爲數據文件或先決條件,並創建當應用程序需要時才下載的文件組。

8-12 說明如何使用“Application Files”對話框來對必需的和可選的文件進行分組。位於列表頂部的文件 (OnDemand.exe) 確定爲應用程序的入口點,而且是部署所需的組件。應用程序圖標文件 (App.ico) 也歸類爲必需項。但將程序集 OrderListControl.dll OrderLibary.dll 分配到名爲“OnDemand”的組。這些文件在應用程序清單中將標記爲可選,並且在首次使用應用程序時不進行安裝。

爲了安裝標記爲可選的項,必須在 ClickOnce 應用程序中包含能夠識別應用程序何時需要可選程序集或其他文件的代碼。然後,代碼必須調用 System.Deployment.ApplicationDeployment類的 DownloadFiles方法或 DownloadFilesAsync方法來安裝所需的文件。有關更多信息,請參閱 Visual Studio 2005 文檔中的“Walkthrough:Downloading Assemblies On Demand with the ClickOnce Deployment API”主題。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_17_0001.jpg

8-12 “Application Files”對話框。

首次打開Application File”對話框時,類型列將所有的文件顯示爲應用程序文件(.dll 文件除外),這些文件都作爲應用程序程序集列出。如圖 8-12 所示,可以更改某些文件的類型。對話框下拉列表中可用的類型選項會根據相關文件類型的變化而變化。例如,可以將 .dll 文件指定爲 Application Assembly Prerequisite。(不能顯式地排除它們。)另一方面,可將文本文件標記爲 Application FileData File Excluded

“Application File”對話框的第三列列出應用程序的文件組。最初,列出的唯一組是 [Required]。如果需要標識那些應當包含在部署但只在某些條件下下載(即可選安裝)的文件,那麼應當創建額外的文件組併爲它們分配文件。

要添加新組,請遵循以下步驟:

1.

“Application File”對話框中,選擇希望包含在新組中的文件。

2.

單擊“Group”字段下的下拉列表並選擇“New”。這會顯示一個“New Group”對話框。

這樣,爲您產生一個新組名,可將“Application File”對話框列表中的其他文件分配到新組。

返回頁首返回頁首

ClickOnce 安全性

在還沒有過多考慮將 ClickOnce 用作部署胖客戶端應用程序的新方法之前,您可能已經開始關心對於安全性而言,其意味所在。ClickOnce 提供一個用於完全功能桌面應用程序的簡化部署模型。這些應用程序可以來自各種不同的源,而且您可能對這些源都有不同程度的信任。(例如,與來自 Internet 的應用程序相比,您可能更信任來自 Intranet 的應用程序。)實際上,ClickOnce 的設計很適合部署非常可靠和安全的應用程序。

返回頁首返回頁首

運行在沙箱中的 ClickOnce 應用程序

默認情況下,ClickOnce 應用程序在一個安全的沙箱中執行。根據特定用戶計算機上安裝的 .NET 安全策略和 ClickOnce 應用程序的安裝或運行位置來確定沙箱。表 8-2 列出基於發佈位置的 ClickOnce 應用程序的默認權限。

8-2 發佈位置的安全區域

發佈位置

安全區域

Internet Web 站點啓動

Internet 區域

Internet Web 站點安裝

Internet 區域

Intranet Web 站點安裝

Intranet 區域

從網絡文件共享進行安裝

Intranet 區域

CD-ROM 進行安裝

全部

.NET Framework 中的默認安全策略具有很高的限制性。在默認的 Internet 區域下運行的應用程序只引用了一些限制,例如,不能訪問本機文件資源,不能連接到數據庫,並且不能與外部 Web 資源進行通信。事實上,在部署 ClickOnce 應用程序之前,需要確定應用程序爲完成工作需要什麼樣的代碼訪問安全性 (CAS) 權限。然後,在安裝時需要配置應用程序以請求這些權限。

返回頁首返回頁首

配置 ClickOnce 代碼訪問安全性

Visual Studio 2005 IDE 項目設計器的“Security”窗格提供一個配置 ClickOnce 應用程序權限的界面。如果它在 Internet 上部署,它就具有默認的 Internet 安全權限。如果在 Intranet 中部署,它就具有 Local Intranet 權限。如果通過其他方式部署,它就具有 Full Trust 權限。正如前一節描述的,可以使用默認的權限部署 ClickOnce 應用程序,在這種情況下,不需要在“Security”窗格中進行任何更改。在 Internet Intranet 部署方案中,默認的權限可能太受限制。相反,使用 Full Trust 權限部署的應用程序可以進行無限制的系統訪問。但是,不論哪種情況,最佳做法是,應用程序應當只包含它實際運行所需的權限。爲了幫助您實現這個目標,“Security”窗格提供一個自定義 ClickOnce 安全設置的界面,如圖 8-13 所示。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_19_0001.jpg

8-13 項目設計器的“Security”窗格。

在開始爲 ClickOnce 自定義安全設置之前,需要選中“Enable ClickOnce Security Settings”複選框。這會激活“Security”窗格中一組與安全相關的控件。通過選擇四個應用程序安裝區域之一,開始自定義過程:Local Computer (Full Trust)Local IntranetInternet Custom。因爲自定義安全設置的目標是定義運行應用程序所需的最低權限,所以可以選擇與應用程序所需權限最匹配的區域,並將該區域作爲權限集的起點。然後,在“Security”窗格中提供的權限表中,通過啓用或禁用所需的單個權限來進一步更改權限集。

要更改表中某個特定的權限,可以滾動到其中列出該權限的行。Setting 列包含一個下拉列表,並有三個選項:IncludeExclude Zone Default。選擇 Include 可以添加權限,選擇 Exclude 可以移除權限。選擇 Zone Default 可以將權限重新設置爲所選區域的默認狀態。 8-14 闡釋手動配置權限的示例。雖然包含 FileIOPermission,但FileDialogPermission 的設置已經顯式地從權限集中排除。請注意,信息圖標出現在 Included 列,該圖標指示 FileIOPermission 所需的信任級別比所選安全區域(在本例中爲 Local Intranet)提供的信任級別高。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_20.jpg

8-14權限設置對話框。

如果在所選擇的區域中加入一個默認情況下不包含的權限,那麼在權限行中就會出現一個信息圖標。這指示應用程序需要提高權限,以在所選擇的區域中運行。

可以通過更改單個權限的特定屬性來進一步更改它們。這允許爲特定的文件或目錄、註冊表項或單個 Web 站點定義權限,這裏列舉幾個示例。

爲了舉例說明,圖 8-15 顯示 FileIOPermission 的屬性頁。該窗口顯示的可用屬性將根據基本權限的不同而有所不同。例如,對於 FileIOPermission 的情況,可以利用網格中提供的複選框來指定哪些文件或文件夾需要文件訪問,並進一步定義讀、寫、追加或路徑發現所需的訪問類型。要請求對文件系統的不受限訪問,請選擇“Grant assemblies unrestricted access to the file system”單選按鈕。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_21.jpg

8-15 FileIOPermission 定義屬性。

如果準確知道應用程序所需的權限,那麼手動修改安全權限就可以了。評估應用程序的安全需求絕對應該是項目開發生命週期的一個必不可少的組成部分,因此應當瞭解需要配置什麼樣的權限。但是,由於許多原因,這並不總是最好的方法。您可能不能確定應用程序所需的權限,或某種特定的權限如何影響應用程序的行爲。在不確定的情況下,您請求的權限很可能高於所需的權限,這違背了確保應用程序只擁有運行所需權限的基本目標。幸運的是,Visual Studio 2005 IDE 包含兩個附加工具權限計算器以及允許使用已配置的安全設置調試應用程序的工具,這可幫助您準確地確定 ClickOnce 應用程序的安全需求。

返回頁首返回頁首

權限計算器

權限計算器可以從項目設計器的Security”窗格中獲得。如果沒有確定應用程序的代碼訪問安全需求,則可以使用權限計算器工具來靜態分析項目中的代碼。分析完成後,該工具自動將項目的 ClickOnce 安全權限更新爲一組自定義權限。

警告因爲權限計算器對代碼進行靜態分析,所以在有些情況下,該工具可能不是百分之百的準確。例如,如果應用程序需要動態文件系統訪問,那麼就需要手動配置這種權限。

返回頁首返回頁首

在安全區域中進行調試

作爲權限計算器的配套工具,可以利用當前定義的 ClickOnce 安全設置在調試器中運行應用程序。這種方法允許您使用部署應用程序時授予的確切權限來測試應用程序。回顧本章前面對非接觸部署侷限性的討論,其中開發人員在一個具有完全信任的環境中構建和調試應用程序,然後在 Internet Intranet 上部署這些應用程序時,讓它們引發安全異常。使用當前定義的 ClickOnce 安全設置在調試器中運行應用程序,這使您在實際部署應用程序時,完全不必猜測它是否具有足夠的權限。

要配置項目以在沙箱中進行調試,請單擊“Security”窗格上的“Advanced”按鈕,顯示配置應用程序的對話框,從而在當前選擇的 ClickOnce 安全設置下運行。還可以指定下載 ClickOnce 應用程序的 URL

8-16 顯示了帶有典型配置的“Advanced Security Settings”對話框。“Debug This Application With The Selected Permission Set”複選框被選中。在文本框中輸入的 URL 值將確定在調試器中執行應用程序時爲其授予的信任級別。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_22.jpg

8-16 在沙箱中啓用調試。

一旦將應用程序配置爲在沙箱中調試,就只需在調試器中運行應用程序,並運用其功能。如果您嘗試執行的應用程序在所選安全區域中沒有所需的權限,那麼就會像實際部署應用程序那樣顯示一個運行時安全錯誤。

返回頁首返回頁首

提升權限

現在考慮爲 ClickOnce 應用程序建立安全設置後執行的操作。當發佈 ClickOnce 應用程序時,將在項目設計器的“Security”窗格中定義的權限寫入應用程序清單的 trustInfo 元素中。

當用戶啓動或安裝應用程序時,ClickOnce 子系統從應用程序清單中讀取請求的權限,並通知用戶他們是否超越了默認安全區域提供的權限。例如,如果在 Internet 上部署了一個需要本地文件系統訪問的 ClickOnce 應用程序,並且通過將應用程序配置爲要求最低權限集而遵循了良好的安全實踐,那麼當用戶從其發佈位置安裝應用程序時,系統將出現一個提示,聲明應用程序要求比 Internet 區域更高的信任級別。

8-17 顯示了當用戶嘗試安裝要求更高信任級別的 ClickOnce 應用程序時出現的安全警告消息。消息窗口底部的消息警告:應用程序要求對計算機進行可能不安全的訪問。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_23.jpg

8-17 應用程序安裝安全警告。

返回頁首返回頁首

改進的安全策略模型

正如在部署策略票證一節中所描述的,對於在託管網絡中使用 ClickOnce 部署的組織而言,Visual Studio 2005 引入了一種新的安全策略模型,網絡管理員可以通過它爲分佈在整個企業中的應用程序建立部署機構。這要求在本地系統上只一次性安裝策略票證,爲由策略標識的實體授予分配 ClickOnce 應用程序的特殊權限。對於安裝了這種策略的計算機,系統會自動授予其升高的權限,而不會對用戶進行提示。

Authenticode 簽名

最後,安全策略也可以根據 ClickOnce 應用程序的發佈者授予權限。數字證書提供有關軟件發佈者的信息,這些信息經過可信的第三方進行驗證。對於商業軟件的發行,您可能會從諸如 Thawte VeriSign 這樣的公司獲得一個證書。您可以使用數字證書來簽署部署清單。.NET Framework SDK 包含一個稱爲 SignCode.exe 的文件簽名工具。

返回頁首返回頁首

Windows Installer 增強功能

Microsoft Windows Installer 是一種安裝和配置服務,它是作爲 Windows Server 2003Windows 2000 Windows XP 的一部分提供的。到撰寫本文時爲止,大多數系統都使用 Windows Installer 2.0 版(包括 Windows 9x Windows NT 4.0,其中 Windows Installer 可以作爲單獨下載進行安裝)。Visual Studio 2005 將支持 Windows Installer 3.0 版,在下面的幾節中,我們將介紹該版本中提供的一些增強功能。

警告雖然可以在 Windows 9x Windows NT 4.0 中使用 Windows Installer 2.0 版,但在這些舊的操作系統上不能使用 Windows Installer 3.0 版。

早期的安裝程序類型使用一種過程式模型,提供應用程序安裝的腳本指令。安裝包文件(其擴展名爲 .msi)使用結構化的存儲來組織資源以及與特定安裝相關聯的自定義操作。在安裝時,Windows Installer 引擎分析安裝文件中的數據,以構建安裝腳本和一個可用於以後卸載程序的回滾腳本。爲了防止卸載破壞其他的應用程序,本地數據庫跟蹤有關計算機上所有應用程序的信息,例如註冊表設置和已安裝的文件。卸載時,Windows Installer 讀取該數據庫,以確認沒有其他應用程序依賴於要移除的文件或註冊表設置。

Windows Installer 還提供一種自修復工具,它允許應用程序自動重新安裝丟失的文件,這些文件可能已經被用戶刪除。一個相關的功能是安裝回滾,如果在安裝的過程中出現了致命錯誤,Windows Installer 可以中止安裝,並使計算機返回到其原始狀態。

Windows Installer 3.0 增強功能

Windows Installer 3.0 版包含了現有 Windows Installer 功能集的許多增強功能,並添加了新的功能區。Windows Installer 3.0 的一個增強功能是更好的作者控制和資源管理,包括對查詢計算機界面和安裝在計算機上其他軟件產品界面的改進。

Windows Installer 3.0 中最重要的改進是添加了軟件修補的功能。儘管在過去的應用程序更新中可能要求完全重新安裝特定的應用程序,但是修補安裝包(或 .msp 文件)允許開發人員爲其應用程序部署增量更新。MSP 文件的主要優點是,它們使得安全包更小、性能更好。

Visual Studio 集成

Visual Studio 2005 基於 Windows Installer 技術構建,包含用於創建綜合、全面安裝的工具。也就是說,您還將發現,Visual Studio 2005 沒有包括充分利用 Windows Installer 功能所需的全部創作工具。例如,Visual Studio 2005 IDE 顯然不能創建 Windows Installer 3.0 軟件更新包。

對於綜合的 Microsoft Windows Installer 創作工具,您應當研究來自第三方供應商的產品,例如 InstallShield Wise

安裝項目Visual Studio 2005 包含幾個基於 Windows Installer 技術構建安裝程序的項目模板。如圖 8-18 所示,安裝程序項目有三種基本類型:安裝項目、Web 安裝項目和智能設備 CAB 項目。根據安裝程序部署位置的不同,它們之間也有所不同:安裝項目將文件安裝到目標計算機的文件系統中;Web 安裝項目將文件安裝到 Web 服務器的一個虛擬目錄中;而智能設備 CAB 項目安裝基於 Pocket PCSmartphone 或其他 Windows-CE 的應用程序。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_25_0001.jpg

8-18 Visual Studio 2005 安裝項目模板。

8-3 總結了各種不同的部署項目類型及其目的。除了上面討論的三種主要安裝項目外,您還可以找到構建合併模塊 CAB 項目的項目模板。

8-3 Visual Studio 2005 部署項目類型

項目

類型目的

安裝項目

爲基於 Windows 的應用程序構建安裝程序

Web 安裝項目

Web 應用程序構建安裝程序

合併模塊項目

可由多個應用程序共享的包組件

CAB 項目

爲下載到舊式 Web 瀏覽器創建一個 cabinet 文件

智能設備 CAB 項目

爲智能設備應用程序構建安裝程序

安裝項目模板的另一種選擇是 Setup Wizard;雖然它自身不是一個安裝項目,但選擇該項將啓動一個嚮導,指導您完成選擇正確部署項目類型的過程。

使用適合於 Visual Studio 6.0 Visual Studio 安裝程序加載項創建的 Windows Installer 項目文件 (.wip) 不能在 Visual Studio 2005 中打開。

合併模塊合併模塊是一種特殊類型的部署項目。它們可用於以單個文件的形式提供應用程序的共享代碼、文件、資源、註冊表項和安裝邏輯。作爲一種簡化形式的 .msi 文件,合併模塊具有一個 .msm 文件擴展名。同樣,它們不能直接安裝,需要合併到一個安裝項目中。當將合併模塊合併到應用程序的 .msi 文件中時,安裝組件(包含在合併模塊中)所需的全部信息和資源都合併到應用程序的 .msi 文件中。因爲安裝組件所需的全部信息都作爲單個文件提供,因此使用合併模塊有助於減少版本衝突、丟失註冊表項以及錯誤地安裝文件。

提示可以從“Project”菜單將合併模塊直接合併到“Setup Project”“Web Setup Project”中。

構建 Windows Installer 安裝包

如果在 Visual Studio 的早期版本中使用過安裝項目,那麼您應該對在 Visual Studio 2005 中構建安裝項目所需要執行的任務非常熟悉。在大多數情況下,您希望將安裝創建成包含要部署的應用程序解決方案的一個子項目。可以選擇一個預定義的安裝項目或者 Setup Wizard 來創建該項目的外殼。使用基於 Windows Installer 的安裝程序(而不使用 ClickOnce)的一個主要優點是,在自定義安裝時它提供了靈活性。而且,Visual Studio 2005 IDE 提供編輯器以處理註冊表設置、文件類型以及關聯項。還可以爲安裝自定義用戶界面,指定啓動條件,定義要在安裝後執行的自定義操作。

提示請記住,對於 ClickOnce 部署,可以包含 Windows Installer 包作爲先決條件。

安裝文件、文件夾和快捷方式安裝項目的基本任務是將文件安裝到目標計算機。文件系統編輯器表示目標計算機上的文件系統,使用該工具可以指定應用程序文件安裝的位置。在大多數情況下,希望將應用程序文件放在 Application Folder 中或在 Application Folder 下創建的子文件夾中。安裝在目標計算機上以後,來自 Application Folder 的文件將位於 Program Files/Manufacturer/ProductName文件夾中,其中 Manufacturer 是安裝 Visual Studio 時使用的公司名,而 ProductName 是用於部署項目的名稱。可以在安裝項目的屬性窗口中重寫這兩個設置。

8-19 顯示了某個安裝項目的文件系統編輯器,它將包含標題爲“WeatherReport”的項目的主要輸出。請注意,該應用程序項目和安裝項目 (WeatherReportMSI) 都列在解決方案資源管理器中。Application Folder 還包括一個正在安裝的應用程序的快捷方式,以及與應用程序相關聯的圖標文件 (CLOUD.ICO)。將圖標文件添加到 Application Folder 後,可以用它來設置快捷方式的圖標屬性,或與添加到目標計算機上 Add or Remove Programs 列表中的項關聯的圖標的屬性(使用安裝項目的 AddRemoveProgramsIcon屬性進行設置)。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_27.jpg

8-19 文件系統編輯器。

您還可以配置安裝,將項添加到目標計算機的桌面和/“Start”菜單。最常見的情況是添加一個已安裝應用程序的快捷方式。在文件系統編輯器中,在名爲“User’s Desktop”“User’s Program Menu”的文件夾中添加快捷方式,從而分別在用戶的桌面和“Start”菜單中安裝快捷方式。在圖 8-19 所示的例子中,可以只剪切“Application Folder”中列出的快捷方式,並將其粘貼到“User’s Desktop”“User’s Program Menu”中,或者在兩者中都粘貼。

創建文件關聯使用 File Types Editor 來建立目標計算機上的文件關聯,方法是將文件擴展名與應用程序相關聯,並指定每種文件類型允許的操作。還可以指定文件類型的默認操作,例如打開或打印文件。當用戶雙擊 Windows 資源管理器中的文件時,會出現默認操作。當用戶右鍵單擊 Windows 資源管理器中的文件時,指定的所有操作在上下文菜單中都顯示爲命令。圖 8-20 顯示了一個使用 File Types Editor 爲文件類型 .wxl 添加“Open”“Print”操作的示例。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_28.jpg

8-20 File Types Editor

修改用戶界面系統自動提供一組在安裝期間顯示的默認對話框。根據正在構建的項目的類型,所提供的這組對話框有所不同。使用用戶界面編輯器,可以將對話框重新排序或刪除對話框。

如圖 8-21 所示,在編輯器中顯示的對話框樹包含兩部分:Install Administrative InstallInstall 部分包括終端用戶運行安裝程序時顯示的對話框,而 Administrative Install 部分包含系統管理員將安裝程序上傳到某個網絡位置時顯示的對話框。如果想構建一個沒有用戶界面的安裝,只需在對話框樹上刪除 Install 部分中的所有對話框。或者,可以從一組可用的模板將對話框添加到安裝項目中。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_29.jpg

8-21 用戶界面編輯器。

管理註冊表項和值如果應用程序安裝需要更改註冊表,可以在安裝期間使用註冊表編輯器來添加註冊表項和值。如圖 8-22 所示,註冊表編輯器提供了一個用於添加註冊表設置的拆分窗格窗口。左邊窗格顯示安裝目標計算機上註冊表的分層視圖,可用它來構建指向一個或更多註冊表項的路徑。使用右邊的窗格來爲當前選擇的註冊表項添加值。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_292.jpg

8-22 註冊表編輯器。

定義啓動條件使用啓動條件編輯器來定義成功運行安裝所必須滿足的條件。例如,可以檢查特定版本的操作系統。如果用戶嘗試在一個不滿足條件的系統上安裝,安裝將中止。還可以配置啓動條件來搜索目標計算機上的某個特定文件、註冊表項或組件。在開始安裝時,Windows Installer 執行搜索和條件評估,並按啓動條件編輯器中所示的順序執行。

8-23 顯示了啓動條件編輯器。該編輯器包含添加搜索和啓動條件的文件夾,它顯示了要求有特定版本的 .NET Framework 的默認啓動條件。對於這種特定的啓動條件,“Properties”窗格允許您指定支持的運行庫。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_30.jpg

8-23 啓動條件編輯器。

定義自定義操作自定義操作提供了一種在安裝結束時執行任務的機制。例如,您可能希望安裝應用程序後啓動一個自注冊的程序或延遲 Web 服務的帳戶信息,或者希望指導用戶進行關於卸載的客戶滿意度調查。自定義操作構建爲單獨的 .dll .exe 文件,然後使用自定義操作編輯器添加到項目中,其中這些操作與不同的安裝階段有關。圖 8-24 顯示了自定義操作編輯器,它包括幾個單獨的文件夾,用於放置執行 InstallCommitRollback Uninstall 任務的二進制文件。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_31.jpg

8-24 自定義操作編輯器。

構建安裝包構建安裝包與編譯一個已完成的 .NET 程序集沒有什麼不同。從“Project”菜單上選擇“Build”,使 .msi 文件與引導程序一起編譯。您還可以從 Visual Studio 2005 IDE 直接測試安裝。當某個安裝項目在 IDE 中運行時,“Project”菜單包含 Install Uninstall 的菜單項,使得安全地測試正在開發的安裝成爲一件非常簡單的事情。圖 8-25 顯示項目的 bin 目錄中出現的安裝包 (MSIDeploy.msi) 和引導程序 (setup.exe)

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_312.jpg

8-25 已編譯的 .msi 安裝文件和引導程序。

返回頁首返回頁首

演練

本示例是一個 Visual Basic .NET Windows 窗體應用程序,它使用 ClickOnce API 提供用戶啓動的更新。開始之前,請確保禁用項目屬性中的自動更新檢查;讓應用程序在用戶每次啓動時都檢查更新,這使用戶啓動的更新可以檢查冗餘(除非您希望用戶永遠不能關閉應用程序!)。

重要事項要通過代碼使用 ClickOnce API,可以將項目引用包含在 System.Deployment 程序集中。

提供 UI 訪問

當然需要爲用戶提供一種檢查應用程序更新的方式。一種選擇是在應用程序主窗體上放置Check For Updates”菜單項。如圖 8-26 所示,演示應用程序包含了使用同步或異步 ClickOnce API 版本進行更新檢查的子菜單。

http://www.microsoft.com/china/msdn/library/langtool/vbnet/art/Chapter8_32.jpg

8-26 使用戶能夠從“Help”菜單輕鬆訪問更新。

添加代碼以檢查更新

在主窗體代碼文件的頂部,按如下方式導入部署命名空間:Import System.Deployment

接着,向檢查更新的菜單項的單擊事件處理程序添加代碼。ApplicationDeployment 是一個包含在 System.Deployment命名空間中的類,您將使用該類的屬性和方法以編程方式更新當前的部署(還要使用該類實現文件的按需下載)。在創建該類的實例之前,檢查靜態的 IsNetworkDeployed 屬性,它是一個指示當前應用程序是否是一個 ClickOnce 應用程序的布爾值:

If True = ApplicationDeployment.IsNetworkDeployed Then

‘Update check code goes here.

End

根據代碼段的說明,將更新檢查代碼放到 if 語句中是明智的,這段代碼確認這是否一個 ClickOnce 應用程序。如果嘗試爲非 ClickOnce 部署的應用程序創建一個 ApplicationDeployment實例,會產生 InvalidDeploymentException錯誤。而且,不能直接創建一個 ApplicationDeployment實例,而要使用返回 ClickOnce 應用程序當前 ApplicationDeployment 對象的靜態屬性 CurrentDeployment

Dim thisDeployment as ApplicationDeployment = _

ApplicationDeployment.CurrentDeployment

一旦創建了 ApplicationDeployment對象的一個實例,就可以調用 CheckForUpdate 方法來確定是否有一個更新版本的應用程序可用。如果有更新,該方法就返回一個布爾值 true

If True = thisDeployment.CheckForUpdate() Then

‘New version of application is available.

Else

‘Application is up-to-date.

End If

該方法的異步版本爲 CheckForUpdateAsync。要實現該方法,首先需要爲 CheckForUpdateCompleted 事件添加一個事件處理程序:

AddHandler thisDeployment.CheckForUpdateCompleted, _

AddressOf CheckForUpdateCompleted

thisDeployment.CheckForUpdateAsync()

CheckForUpdateCompleted 事件的方法簽名包含一個 CheckForUpdateCompletedEventArgs對象。在事件處理程序中,需要檢查 CheckForUpdateCompletedEventArgs UpdateAvailable屬性布爾值來確定該應用程序是否有新版本可用:

Private Sub CheckForUpdateCompleted(ByVal sender As Object, _

ByVal e As CheckForUpdateCompletedEventArgs)

If e.UpdateAvailable Then

‘New version of application is available.

Else

‘Application is up-to-date.

End If

End Sub

在主應用程序線程上調用 CheckForUpdateCompleted 事件。因此,在該回調中直接使用應用程序的 Windows 窗體控件非常安全。ApplicationDeployment類的 Update 方法將應用程序更新爲最新版本:

thisDeployment.Update()

該方法的異步版本 UpdateAsync 使用的模式與 CheckForUpdateAsync 方法使用的模式相同。UpdateAsync方法引發兩個單獨的事件:在下載更新的應用程序文件期間,ProgressChanged不時出現,這對於報告大型應用程序的安裝進度或在一個較慢的網絡連接上更新該執行非常有用;更新完成後,UpdateComplete出現。在調用 UpdateAsync方法之前,首先爲 UpdateComplete事件和 ProgressChanged事件(可選)添加事件處理程序:

AddHandler thisDeployment.UpdateCompleted, AddressOf Update_UpdateCompleted

AddHandler thisDeployment.ProgressChanged, AddressOf Update_ProgressChanged

thisDeployment.UpdateAsync()

ProgressChanged事件處理程序的方法簽名包含一個 DeploymentProgressChangedEventArgs參數。可以通過訪問該對象的屬性來報告應用程序更新的狀態。在本示例中,進程信息寫入應用程序主 Windows 窗體狀態條上的面板中。

Private Sub Update_ProgressChanged(ByVal sender As Object, _

ByVal e As DeploymentProgressChangedEventArgs)

‘Calculate progress of update and store value in local string.

Dim updateProgress As String = String.Format( _

“{:D}K out of {1:D}K downloaded - {2:D}% complete", _

e.BytesCompleted / 1024, _

e.BytesTotal / 1024, e.ProgressPercentage)

‘Update status bar with update progress.

Me.StatusStripPanel2.Text = updateProgress

End Sub

UpdateComplete事件處理程序的方法簽名包含一個 AsyncCompletedEventArgs參數。事件處理程序中的代碼應當檢查該對象的屬性來確定應用程序更新的結果。AsyncCompletedEventArgs公開兩個屬性,一個是 Cancelled 屬性,表明是否取消更新,另一個是 Error 屬性,包含更新過程中發生錯誤時的異常信息。

Private Sub Update_UpdateCompleted(ByVal sender As Object, _

ByVal e As AsyncCompletedEventArgs

If Not e.Cancelled Then

If (e.Error Is Nothing) Then

‘Update was successful.

Else

‘Error occurred during update.

End If

Else

‘Update was cancelled.

End If

End Sub

返回頁首返回頁首

小結

使用 ClickOnce,部署和更新胖客戶端應用程序與部署和更新 Web 應用程序一樣簡單和容易。使用 Visual Studio 2005 中提供的工具,嚮應用程序添加 ClickOnce 功能非常簡單。構建自定義更新解決方案的編程模型功能強大而且相當簡單,它爲處理各種部署方案提供足夠的空間。最後,可能也是最重要的一點,使用內置於 ClickOnce 中的安全功能,您提供的應用程序不僅功能豐富,而且便於部署和維護,同時還可以獲得 .NET Framework 提供的保護。

雖然 Visual Studio 2005 .NET Framework 2.0 引入了一種簡單且易於使用的聲明性模型,用於通過 ClickOnce 部署應用程序,但它不是萬能的。對於更復雜的應用程序安裝(可能需要部署共享組件,或需要對計算機系統進行具有重要影響的其他更改),緊密集成到所有現代 Windows 操作系統中的 Microsoft Windows Installer 技術爲您提供了強大的功能和靈活性,用於構建可靠和高度可自定義的安裝程序。

 
發佈了3 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章