簡介
您是否曾經必須部署 Visual Basic 客戶端服務器應用程序?或者曾經必須部署依賴於 COM 注冊的 Win 應用程序?企業桌面環境中的正確安裝一直受到各種問題的困擾這其中既有試圖使所有用戶升級這樣的簡單問題也有較為復雜的 DLL 版本控制問題
與 Web 應用程序相比桌面應用程序有很多優點具體表現在以下幾個方面
◆豐富的用戶界面 (UI)
◆較快的響應速度
◆較好的性能
◆能夠脫機運行
◆可以有效地使用邊緣資源(客戶機)
◆易於同本地應用程序和 API 集成
盡管桌面應用程序具有以上優點但由於 Web 應用程序使應用程序的部署和更新相對容易因此在過去幾年中得到了廣泛的應用
Microsoft 准備通過 NET Framework 將 Web 應用程序在部署和維護方面的所有優點都集成到桌面應用程序中DLL 版本控制問題也得到了解決 在默認情況下使用 NET Framework 生成的應用程序彼此完全孤立並從各自的專用應用程序目錄中檢索其 DLLDLL 仍然可以在多個應用程序之間共享但這並非使用系統注冊表實現而是將共享的 DLL 存儲在 NET Framework 全局程序集緩存中該程序集緩存可加載給定 DLL 的多個版本並跟蹤版本與應用程序之間的匹配關系在實際部署應用程序的過程中NET Framework 允許系統管理員按照部署和更新 Web 應用程序(通過遠程 Web 服務器)的方式部署應用程序和應用程序更新此項技術稱為無接觸部署是本文要論述的中心內容
使用 Web 服務器的無接觸部署
使用無接觸部署可以下載安裝和直接在用戶計算機上運行 Windows 窗體應用程序(使用 NET Framework 的 Windows 窗體類生成的桌面應用程序)而無須改變注冊表或共享的系統組件
工作原理
NET Framework 安裝提供了一個掛接 Internet Explorer 和更高版本以偵聽所請求的 NET 程序集的機制在請求期間可執行程序被下載到磁盤上稱為程序集下載緩存的位置然後名為 IEExec 的進程在具有有限安全設置的環境中啟動該應用程序
示例演示
這是一個非常簡單的 Windows 窗體應用程序用戶可以使用它管理任務列表這些任務可用於錯誤跟蹤IT 疑難解答也可用於任務列表(該列表與 Outlook XP 或 Visual Studio NET 中的列表相似)
首先在 Visual Studio NET 中打開此應用程序任務管理應用程序是在 Visual Basic NET 中使用 Windows 窗體和名為 TaskMgmtWS 的 XML Web Service(它使用 ADONET 與 Access 數據庫通信以存儲任務)實現的
任務管理應用程序使用 TaskMgmtWS Web 服務更新 DataGrid Windows 控件應用程序首先實例化一個名為 ws 的 XML Web Service 對象接著調用 Web 方法 GetTasks()獲取任務的 ADONET 數據集然後將任務數據集分配給 DataGrid Windows 控件中的 DataSource 屬性
調用 Web 服務
Dim ws As localhostService = New localhostService()
Dim ds As DataSet = wsGetTasks()
將生成的數據集綁定到 DataGrid 控件
DataGridDataSource = ds
DataGridDataMember = Tasks
應用程序返回時DataGrid 被更新應用程序也將更新此時我們遇到了在基於網絡的應用程序中常見的問題第一次加載期間應用程序將生成一個網絡調用可能需要幾秒鐘才能完成
提高 Windows 窗體響應速度
要提高應用程序的總體響應速度可以利用後台線程已更新的應用程序首先調用輔助線程來實例化一個 XML Web Service 對象Web 服務實例化後我們將使用 MethodInoker() 來安全地更新 UI
從 Form Load 事件中的輔助線程開始
使用後台輔助線程生成 Web 服務調用
以提高第一次窗體加載過程中應用程序的總體響應速度
ThreadPoolQueueUserWorkItem(New WaitCallback
(AddressOf GetTasksWebServiceBackground))
有關如何在後台線程中更新 Windows 窗體的詳細信息請訪問知識庫文章 QPopulate DataGrid on Background Thread with Data Binding by Using Visual 在 Windows 窗體運行的同時編寫一個作用於 XML Web Service 調用的後台線程
Private Sub GetTasksWebServiceBackground(ByVal data As Object)
調用 Web 服務
Dim ws As localhostService = New localhostService()
m_ds = wsGetTasks()
更新 Windows 窗體數據網格
Dim mi As New MethodInvoker(AddressOf UpdateDataGridForm)
Dim ia As IAsyncResult = BeginInvoke(mi)
Cursor = CursorsDefault
End Sub
為了說明如何將應用程序部署到 Web 服務器上我們將任務管理應用程序部署到 Tasks Web Service Web 文件夾中首先將生成文件夾更改為 TaskMgmtWS Web Service IIS 虛擬目錄方法是打開TaskManagement Property Pages(TaskManagement 屬性頁)對話框然後將輸出路徑設置為\TaskMgmtWS\
將生成結果路徑設置為 Web 服務器後可以通過簡單的重新編譯來部署此應用程序應用程序生成後我們可打開 Internet Explorer 並浏覽到應用程序 請注意安裝了 NET Framework 的 Internet Explorer 不會要求您保存該應用程序而是嘗試運行該程序如果要從 Web 頁下載應用程序可以使用file://協議處理程序
應用程序現已通過 HTTP 下載並安裝到程序集下載緩存中運行該應用程序之前將檢查安全策略以確保應用程序擁有執行其操作的權限
上面介紹了如何通過 Web 服務器運行該應用程序下面就讓我們更改該應用程序看看對它進行升級有多麼容易選擇 DataGrid可以使用 Auto Format(自動套用格式)屬性快速更改背景樣式
然後重新生成應用程序以更新 Web 服務器上的 exe 文件最妙的是當用戶請求返回到 Windows 窗體時應用程序代碼將自動更新NET Framework 將自動檢查程序集的時間戳查看是需要再次下載該程序集還是只需通過用戶的程序集下載緩存來運行該程序集
安全性
代碼訪問安全性是保護桌面免受正在通過無接觸部署方式下載的 Windows 窗體應用程序影響的關鍵此模型通過匹配應用程序和應該分配給應用程序的權限來工作在運行時公共語言運行時從程序集中收集憑證憑證可以采用代碼源自的 Internet Explorer 區域(本地磁盤IntranetInternet受信任站點或不受信任站點)的形式也可采用代碼源自的 URL(簽名使用的私鑰哈希值Authenticode 發布服務器簽名等等)的形式使用此憑證公共語言運行時將程序集分配給相應的代碼組或類別每個代碼組都擁有分配給它的權限集說明程序集應獲得的權限例如能否讀取或寫入本地磁盤訪問聯網資源打印以及訪問環境變量等等
默認情況下NET Framework 附帶圍繞 Internet Explorer 區域設置的代碼組例如來自 Intranet 區域的代碼獲得的權限很有限因此無法執行文件 IO 訪問
為了說明安全檢查在起作用任務管理可執行程序包含一個名為 Read Bootini 的工具欄按鈕該按鈕嘗試訪問 C:\ 盤中的文件
您可以進行一個簡單的測試單擊Read Bootini按鈕查看當應用程序請求 C:\ 根目錄中的文件時會發生什麼情況 引發安全異常應用程序不處理該請求
異常返回一個文件 IO 權限異常說明應用程序無法訪問 TaskManagementexe 請求的特定資源
使用多程序集應用程序的無接觸部署
在本示例應用程序中我們已經說明了如何加載單個程序集通過對 Assemble 對象使用 LoadFrom() 方法NET Framework 還可以有效地將多程序集應用程序傳入客戶端
Assemble 類具有 LoadFrom 方法可以初始化一個對特定程序集的引用LoadFrom 的參數是 URL 或文件路徑名指定 URL 後NET Framework 首先通過檢查程序集下載緩存檢查客戶端是否存在已命名的程序集如果程序集不在程序集下載緩存中NET Framework 將從 Web 服務器獲取該程序集並將它的副本置於下載緩存中這樣程序集對象即可在代碼中使用
例如如果在一個單獨的名為 AboutFormdll 的程序集中實現了 TaskManagement About Windows 窗體則可以在用戶請求查看About(關於)對話框時使用 LoadFrom 下載該程序集這樣當用戶與應用程序交互時我們只需傳輸應用程序所需的代碼
無接觸部署和 XML Web Service
一個重要的安全限制是當通過 Web 服務器分發應用程序時其域必須與它所依賴的所有 Web 服務相匹配例如如果從 啟動 TaskManagementexe則只允許使用//myserver 上的 XML Web Service出於安全性方面的考慮不允許應用程序從其他服務器調用 Web 服務
可選如何設置安全策略
計算機管理員可以更改安全權限以便將更多權限授予現有代碼組或從頭開始創建新代碼組
繼續操作之前必須明白更改安全設置是很危險的因此切勿將其關閉強烈建議在任何情況下都只更改能使應用程序運行的安全設置
為此如果您是計算機管理員則可以運行 CasPol 命令行工具(位於 %SystemRoot%\MicrosoftNET\Framework\v\CasPolexe)為從本地主機啟動的應用程序授予對本地磁盤的完全訪問權限
caspol machine addgroup All_Code //localhost/* FullTrust n TaskManagement
現在由於此應用程序具有執行文件 IO 的權限因此能夠返回 Bootini 的內容
除了 CasPol 命令行工具以外還通過 Microsoft 管理控制台 (MMC) 管理單元提供了圖形配置工具即 NET Framework 配置工具打開管理單元後打開My Computer(我的電腦)單擊Runtime Security Policy(運行時安全策略)然後依次單擊Machine(計算機)Code Groups(代碼組)和All_Code(所有代碼)浏覽到 TaskManagement使用 TaskManagement 可以查看新建的代碼組嘗試設置新代碼組了解由代碼訪問安全設置所帶來的靈活性和把握度
確保查看各選項後刪除在上文中創建的代碼組可以通過運行以下命令完成此操作
caspol remgroup TaskManagement
也可通過 MMC 工具在 TaskManagement 上單擊右鍵並選擇 Delete(刪除)來刪除新代碼組該工具使您能夠輕松地在代碼組之外生成 MSI 文件如果需要可以使用系統管理服務器或組策略在企業中傳播該文件
客戶端要求
◆任何支持 NET Framework 的操作系統
◆已安裝 SP 的 NET Framework
◆Internet Explorer 或更高版本
◆訪問 IIS Web 服務器進行應用程序部署
小結
無接觸部署為分發 Window 窗體應用程序提供了非常好的方法應用程序開發人員可以利用這一強大的桌面處理能力同時保持由 Web 應用程序實現的部署和維護的優點
From:http://tw.wingwit.com/Article/program/net/201311/12019.html