Mauro Sant'Anna Microsoft Regional Director
摘要:查看 ClickOnce 技術、將其與其他部署技術進行比較以及展示如何在應用程序中使用該技術。
簡介
ClickOnce 是 Visual Studio 2005 中即將包含的全新的 Windows 窗體部署技術。該技術使用智能客戶端簡化 Web 應用程序的安裝和升級。自 .NET Framework 的第一個版本以來,Windows 窗體應用程序部署就一直可以通過 HTTP 進行,並且自那時起就一直處於發展之中。本文討論了 Windows 窗體應用程序的優勢以及引發 ClickOnce 出現的窗體應用程序的技術進展。我還將使用發佈的 Visual Studio 2005 Beta 1 版展示一個簡單的示例。
爲什麼要使用 Windows 窗體?
由於萬維網的出現,大多數用戶和開發人員都對 Web 應用程序比“常規的” Windows 應用程序表現出更大的興趣。除了“酷炫因素”之外,Web 應用程序還具有一些引人入勝的特殊特性:
• |
在全球任何具有 Internet 連接的地方,都可以訪問 Web 應用程序,客戶端甚至不需要運行 Windows。當您的應用程序需要常見的訪問時,“純 Web”應用程序是一種非常好的技術。 |
• |
Web 應用程序易於部署和更新:只需要將應用程序文件複製到 Web 服務器的目錄中,您的所有客戶端可以立即開始使用新的應用程序。沒有 DLL 地獄、沒有糾纏不清的註冊表項、沒有需要註冊的 COM 類,它就能很好地工作! |
本文重點討論上述第二項:部署。Web 應用程序使用的 HTTP 協議相對於傳統的 Windows 應用程序部署具有多種優勢。
另一方面,正如我熱愛 Web 一樣,很難說用戶對 Web 的體驗是第一流的。與 Windows 應用程序相比,Web 應用程序也存在幾個不足之處:
• |
其用戶界面非常簡單。在 Windows 應用程序中一些理所當然的功能(如拖放和右鍵單擊鼠標),在 Web 應用程序中也非常難於操作甚至不能實現。 |
• |
即使我們要設法實現豐富的界面技巧,也通常需要大量的客戶端腳本(一種非常難編寫和調試的代碼)。 |
• |
Web 應用程序使用大量的服務器資源、帶寬以及用戶的耐心,因爲大部分事情都在服務器上執行,需要往返行程和等候。 |
• |
打印也受到“打印屏幕技術”的限制,由於字體、頁邊距以及紙張大小不同,對許多操作(如分頁)都幾乎不能控制。 |
• |
儘管其中有些問題可以通過使用插件或 ActiveX 控件得到緩解,但是反過來又可能存在一些部署問題,它們與非 Web 應用程序過去常有的部署問題相同。 |
如果我們將 Web 應用程序的易於分發與 Windows 應用程序的豐富客戶端體驗相結合,將會怎麼樣?好,我們可以將它們相結合。從 .NET Framework 的第一個版本起,它就允許通過 HTTP 分發 Windows 窗體應用程序,而沒有出現常見的問題。
這種類型的應用程序尤其適用於不要求常見訪問的 Intranet/Extranet 環境,我們假設最終用戶的計算機都將安裝有 Internet Explorer 和 .NET Framework。
.NET Framework 1.x: HREFing .EXEs
.NET Framework 1.0 和 1.1 版都是“開包即用”,能夠通過 HTTP 部署 Windows 窗體應用程序。您只要使用 "HREF" 標記指向託管的 .EXE。Internet Explorer 和 .NET Framework 運行庫可以按需下載並運行可執行文件及其所需的 DLL。這種類型的部署暱稱爲“hrefing EXE”。
以下是這種標記的一個示例:
<a href="MainProject.exe">Call MainProject</a>
標記非常簡單,推薦參閱以下幾篇文章,它們已經對此進行了討論:
• |
Security and Versioning Models in the Windows Forms Engine Help You Create and Deploy Smart Clients 作者:Chris Sells;也可以參閱他的 smart client Wahoo! sample |
• |
Death of the Browser? 作者: Billy Hollis |
• | |
• |
因爲 .NET 程序集(.EXE 或 .DLL)是基本的部署單元,所以您要將應用程序拆分成主 .EXE 和多個 DLL。這樣,如果對單個 DLL 進行簡單修改,則只需要下載此 DLL。
聽起來似乎很容易,但是要使其正確工作,仍然需要一些技巧:
• |
客戶端上此前必須已經安裝了 .NET Framework(儘管可以從 http://msdn.microsoft.com/vstudio/downloads/tools/bootstrapper/ 下載插件,使安裝 Framework 和您的應用程序變得更簡單)。 |
• |
您的應用程序將作爲部分受信任的代碼在客戶端上運行。一方面,這樣做非常合適,因爲應用程序在沙箱中運行,而且可限制它對客戶端計算機的操作。另一方面,如果需要諸如打開本地文件或調用 COM 對象等功能,則必須以某種方式在客戶端上設置安全策略,這一點很重要。 |
• |
默認情況下,可執行文件很有可能試圖加載多個含有本地化資源的 DLL;由於當前實現中的某些問題,性能將會受到影響(尤其在較慢的 Internet 鏈接中)。 |
• |
更新以文件到文件爲基礎進行;例如,無法保證確實已下載了全部 10 個更新文件;客戶端可能無法擺脫“半更新的”應用程序。 |
• |
只有用戶在 Internet Explorer 中手動設置爲“脫機工作”時,才能脫機使用應用程序;應用程序本身不能對其進行控制。 |
• |
默認情況下,不能使用與程序關聯的 .config 文件(單擊此處瞭解如何使用)。 |
• |
您的應用程序不會在桌面或 Start 菜單中添加快捷方式。 |
更新應用程序塊
爲了解決以上提出的一些問題,Microsoft 創建了 更新應用程序塊 (UAB)。該更新塊是一個庫,您可以將其添加到應用程序中,這樣,就可以通過 HTTP 管理應用程序塊的下載。
有別於最初的 Framework 實現,它具有以下一些優勢:
• |
它作爲本地應用程序運行,並且可在任何時候使用,不會對性能造成影響。 |
• |
更新是事務處理,即在新版本可用之前必須成功下載所有新版本的文件。 |
• |
所有應用程序文件都以清單形式列出。 |
• |
它作爲完全受信任的應用程序運行,您不需要調整客戶端安全策略。 |
• |
您的應用程序會在 Start 菜單上添加快捷方式。 |
另一方面,還有一些不足:
• |
爲了使用應用程序,您必須對其進行較大的修改。 |
• |
由於使用 BITS 下載應用程序塊,因此它不能在 Windows 98/ME 中運行,而只能在 Windows 2000 或更高版本中運行。 |
• |
它作爲完全受信任的本地應用程序運行,因此,它幾乎忽略代碼訪問的安全性。 |
• |
Microsoft 沒有爲它提供支持。 |
有關 UAB 的更多信息,請參閱 Jamie Cool 撰寫的 .NET Application Updater Component。您也可以參閱 Gotdotnet 上的 the home of the UAB。雖然 UAB 沒有獲得“官方的”支持, 但是 www.gotdotnet.com 網站上有一個論壇。無論如何,UAB 帶有完整的源代碼,您可以對其進行修改,以修補其中的一些限制(如需要 BITS 和 Windows 2000)。
ClickOnce
很明顯,UAB 只是一種過渡措施,期間 Microsoft 開發了一個最終的解決方案。此解決方案就是 ClickOnce。ClickOnce 基本上具有 UAB 的所有優勢,但卻幾乎沒有其不足,而且還外加 了一些新增功能。在我看來,ClickOnce 的一個主要優勢就是它恢復了代碼訪問的安全性。
與 HREF EXE 相比,ClickOnce 應用程序具有如下優勢:
• |
更新是事務處理(即,要麼完全執行,要麼根本不執行)。 |
• |
該應用程序不但可以脫機工作,而且還可以對其進行某種程度的控制;有一些 API 可使應用程序發現它是聯機或脫機;它還可以控制其自身的更新過程; |
• |
它可以與 Visual Studio .NET 進行良好的集成,包括能夠生成合適的額外文件和工具,幫助您找到運行應用程序所需的安全權限。 |
• |
它具有一個可下載必需組件(甚至 .NET Framework 自身)的 Win32“bootstraper”可執行文件。 |
• |
可以按需要或以批處理方式下載應用程序文件; |
• |
它可在 Start 菜單中添加快捷方式; |
ClickOnce 是 Visual Studio 2005(以前的開發代碼名爲“Whidbey”)和 .NET Framework 2.0 的一個功能。讓我們來看使用“Community Preview Beta 1”(Framework 2.0.40607 版)的一個示例。
一個 ClickOnce 應用程序
我們遵循以下步驟來創建一個簡單的 ClickOnce 應用程序。
1. |
啓動 Visual Studio 2005。 |
2. |
選擇 File,然後單擊 New Project。 |
3. |
選擇一種語言(C# 或 Visual Basic .NET)並選定 Windows 應用程序。 |
4. |
將項目命名爲 MyClickOnceApp 並單擊“確定”。 |
5. |
向窗體中添加一個按鈕,並將其 Text 屬性更改爲 About。 |
6. |
雙擊該按鈕。在代碼窗口中輸入以下代碼。 Visual Basic .NET: MsgBox("My First ClickOnce Application") C#: MessageBox.Show("My First ClickOnce Application"); |
按下 F5 鍵運行並測試應用程序。
在 Visual Studio 2005 中,所有的 Windows 應用程序在 Project | MyClickOnceApp Properties 中都有一個 Publish 頁,可控制部署詳細信息:
圖 1. 配置發佈設置
Publishing Location 表示將從其部署應用程序的位置。它可以是一個 Web 服務器 (HTTP) 位置(如前所示),但是,也可以是一個常規的網絡路徑。
Install Mode and Settings 控制多種部署詳細信息,例如:
• |
應用程序是僅支持聯機使用還是也支持脫機使用。 |
• |
Application Files:單個文件的安裝位置。 |
• |
前提條件:安裝程序是否必須安裝其他組件,例如 Windows Installer 2.0、.NET Framework 2.0、J# Redistributable Package、SQL Server 2005 Express、Crystal Reports 以及 Microsoft Data Access Components 2.8。 圖 2. 配置前提條件 |
• |
Updates:控制應用程序應在何時檢查更新以及如何向客戶端提供這些更新。 圖 3. 配置更新 |
• |
選項:調整詳細信息,例如應用程序語言、Start 菜單快捷方式資源名稱、用於 Web 部署的 HTML 頁以及部署策略票據。 圖 4. 配置發佈選項 |
Publish Version 調整應用程序版本號;每次部署時版本號可以自動增加。
Publish Wizard 允許設置不同的發佈選項。該向導還可以通過 Build | Publish 菜單調用。所有的 ClickOnce 應用程序必須以加密方式進行簽名;該向導請求一個現有密鑰(推薦)或生成一個新密鑰。
圖 5. 對應用程序進行簽名
在運行一次該向導之後,就可以單擊 Publish Now 發佈更新。在我們的示例中將顯示一個 Web 頁。
圖 6. 發佈的應用程序
該 Web 頁包含一個腳本,它檢查在安裝應用程序之前必須安裝哪一個額外的“前提條件”安裝包。如果沒有“前提條件”,則會在應用程序首次運行時安裝。
在用戶單擊 Install 鏈接後,會出現多個可能要求用戶干預的對話框(至少首次運行時要求用戶干預):
• |
Windows XP SP2 警告 |
• |
軟件許可協議 |
• |
缺少發佈方簽名認證 |
部署詳細信息
Visual Studio .NET 2005 將爲應用程序創建一個具有多個文件和文件夾的新 Web。
圖 7. 部署文件夾
dotnetfx 文件夾包含可重新發布的 .NET Framework(目前爲一個 25 MB 的可執行文件)。
默認情況下,Visual Studio 將在每次部署應用程序時增加版本號;每個版本將獲得一個與增加版本號相對應的新文件夾。
.application 文件是 HTML 頁 publish.htm 中顯示鏈接的目標。它是一個包含信息(如與應用程序當前版本和當前數字簽名相對應的文件夾)的 XML 文件。
Publish.htm 是一個 Web 頁,不僅包含指向 .application 文件的鏈接,而且包含一些客戶端腳本可以進行某些版本檢查並顯示相應的信息。例如,如果您的計算機沒有 .NET Framework,Install MyClickOnceApp 將會顯示不同的消息。
Setup.exe 是一個 Win32 可執行文件,不僅可以安裝應用程序,而且可以按正確的次序安裝必需的組件(如 .NET Framework 自身和 MDAC 2.8)。
每個應用程序文件夾包含應用程序的文件和清單文件。清單是一個 XML 文件,主要包含如下信息:
• |
所有應用程序文件的確切身份。該身份包含文件名、版本號、區域性以及處理器體系結構(本示例中爲“msil”)。 |
• |
應用程序所需的所有權限。 |
• |
數字簽名。 |
運行應用程序
應用程序下載完成後,可以運行它而不用再次下載。在我們的示例中,可以通過單擊指向 Web 頁的鏈接或 Start 菜單中的快捷方式啓動應用程序。在這兩種情況下,根據 Application Updates 項目選項中的設置可以檢查是否存在新版本。需要時可以下載新版本。
要檢查更新功能,請按如下步驟操作:
1. |
對應用程序進行一次可見的更改,例如更改窗體上按鈕的位置。 |
2. |
再次構建按鈕並部署。 |
3. |
運行應用程序並檢查下載過程。 |
最後請注意:該信息是基於 Visual Studio .NET Beta 1 版的,這一點非常重要;新版本可能具有不同的功能。
比較圖表 | |||
HREF .EXE | UAB | ClickOnce | |
應用程序不要求更改 |
X |
|
X |
應用程序隔離 |
X |
|
X |
完全支持 |
X |
|
X |
較低的系統影響 |
X |
|
X |
保留代碼訪問安全 |
X |
|
X |
按需文件下載 |
X |
|
X |
以聲明方式列出的必需文件的清單 |
|
X |
X |
以加密方式簽名的清單 |
|
|
X |
批處理文件下載 |
|
X |
X |
脫機工作 |
(*) |
X |
X |
事務處理安裝 |
|
X |
X |
最佳性能 |
|
X |
X |
Windows 2000 或更高版本要求 |
|
X |
(**) |
Windows 外殼集成 |
|
X |
X |
對更新過程的正確控制 |
|
X |
X |
脫機工作和控制下載過程的 API |
|
X |
X |
可選包的自動安裝 |
|
|
X |
(*) 要求用戶干預
(**) 對測試版產品來說還爲時過早
小結
ClickOnce 是一種功能非常強大的應用程序部署技術。它是以前所用的部署模式的自然發展,爲具有豐富客戶端體驗的 Windows 窗體應用程序提供了可靠性、安全性、性能和靈活性。
關於作者
Mauro Sant'Anna ([email protected]) 是 Microsoft 的一名區域經理,MCSD、MCSE、開發人員和培訓師。自從.NET 在奧蘭多 PDC 2000 上公開發布以來,他是第一個信徒。