最近手上的 Smart Client 項目已接近尾聲,正準備為其添加“自動更新”功能。因為時間緊迫,完全自己開發是不可能了,再説已有現成的,為什麼不用呢?呵呵~

目前,實現“自動更新”這個特徵,主要有兩種選擇:一個是採用 Microsoft Practice & Patterns 中提供的 Updater Application Block (現在屬於 Enterprise Library 的一部分);另一種選擇是採用 windowsforms.net 上一個微軟員工寫的一個 AppUpdater 組件。

這兩個東西有相似的地方,也有不同的地方,比如 Updater Application Block 提供了很強大的擴展接口,但個人感覺也有些體積龐大;後者比較小巧,windowsforms.net 中推出的 Terrarium (一個基於 .net 的遊戲程序,也是一個典型的 Smart Client)中即採用了這個小傢伙,並對它進行了擴展(Terrarium 中比較特殊的兩點擴展是:1.採用Web Service形式,2.更新控制更加智能:只告訴一定數量的客户端需要更新軟件,而告訴其他客户端“沒有”更新,從而避免了更新高峯使服務器癱瘓的情形。隨後逐批通知其他客户端更新軟件。)

在搜索結果中發現,AppUpdater有一個廣為人知的問題,如下圖所示的提示:


automationlicensemanager 重新下載_資源文件


Unable to auto-download the missing parts of the application from:
http://localhost/temp/System.resources.dll

但發現多數人給出的建議(比如:(鏈接已失效))就是,在系統中找到這些所謂“遺失”的文件,然後把它們加入到程序目錄中來。

事實上,這些都是些資源文件,而且它們存在系統目錄中,不應該是“missing”才對(因為程序也沒有因為缺少它們而出現其他問題)。

搜索結果還發現一個現象是:問這個問題的大都是中文、日文、還有不認識的歐洲語言、俄語等等,基本上沒看到英語用户在討論這個問題。

我也查找了缺少的這些資源文件,它們所在的目錄是:C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\zh-CHS

這樣就比較明顯了,對於英語用户他們不需要這些資源文件,他們使用已經打包在系統 dll 中的默認資源。可這個只是解釋了為什麼英語用户不討論這個話題的現象。

簡單看了 AppUpdater 的源碼,發現這個錯誤提示出現的位置是一段自動下載缺失assembly的方法,它掛接了 AppDomain? 類的 AssemblyResolve 事件,當程序集解析失敗時,自動從網絡中下載。

我的初步猜測是,這幾個資源文件是 AppUpdater.dll 自身依賴的,然後在它自己對自己進行解析時引發了這個 AssemblyResolve 事件。

很抱歉,我還沒給出解決方法,僅僅初步分析了一下(還不知道對不對,最近太忙,閒下來再研究)。

另,這次第一次做 Smart Client 程序(這次主要突出的是離線工作的特徵),有很多經驗教訓,過些日子待項目平靜下來開始整理整理,做一些文章給大家參考。