在決定使用ClickOnce發佈你的軟件前,應該知道的一些事情

寫在前面的話

用C#開發一個桌面軟件,安裝到分佈各地的數以百計的PC上,軟件的修改和升級在未來很長一段時間內都很頻繁,所以採用了微軟的ClickOnce部署技術。

這是一種上手很快使用方便的技術,但是你在決定把它應用在一個真正的商業項目中之前,應該瞭解一些將來可能會困擾你的問題,然後再判斷一下是不是應該採用它。

也許自己從頭寫一個自動升級框架反而更適合你的情況。

1,無法有效避免非法的下載

使用ClickOnce部署,你的軟件的更新版可以發佈到Web服務器上,當用戶從開始菜單啓動軟件時,ClickOnce自動到指定的URL去檢測是否存在新版本,並且從這個地址下載最新版本。

問題在於,訪問這個URL的過程是ClickOnce的內部機能,不和用戶產生任何交互,也就沒法進行有效的用戶驗證,要想ClickOnce正常更新,就必須保證這個URL能夠任意訪問。導致任何人只要在瀏覽器輸入這個URL,就可以下載程序。

2,.NET Framework安裝的煩惱

使用ClickOnce可以自動驗證客戶端PC是否安裝了必需的.NET Framework以及其版本,並且可以自動啓動一個下載程序從微軟網站取得最新的安裝文件。

這是一個很有用的功能,一般情況下很難說服用戶先去微軟網站自己安裝.NET Framework,大多數用戶甚至根本不想知道什麼是Framework(很難和他們解釋清楚,爲什麼安裝一個很小的軟件,需要先安裝一個幾百兆大的叫做Framework的鬼東西)。

然而在實際測試中發現了一個問題,用戶的PC在公司內部通過代理才能訪問互聯網,不知什麼原因,自動下載程序訪問微軟網站的速度慢到無法接受的程度,大約200M的Framework,60個文件,自動安裝整整花費了一個多小時,遠遠不如自己直接下載安裝包手動安裝來的快。

3,.NET Framework安裝的另一個煩惱

解決了上面的問題,我已經把軟件和.NET Framework都部署在Web服務器上,鼠標一點,似乎一切都順利。然而隨着安裝軟件的用戶數越來越多,自動安裝過程中發生莫名錯誤也越來越多。

問題的原因在於,有些PC裏面已經安裝過不同版本Framework3.5SP1,但是又和我發佈的版本不盡相同,比如沒有語言包等等,ClickOnce沒有辦法自動覆蓋安裝。
Framework安裝版本衝突的問題其實很常見,一般性的解決辦法就是從控制面板刪除現有的版本之後重啓計算機,再重新安裝即可。仍然不行的話可以藉助微軟官方提供的.NET Framework Cleanup工具徹底刪除既存版本。

但是這種解決方式對於最終用戶來說不可接受,他們需要的是真正的ClickOnce:點擊一下,幫我解決所有問題。

4,安裝目錄和卸載

軟件投入使用後,每次版本升級,都會經過很長時間的停頓才能看到程序的啓動畫面。調查之後發現:ClickOnce部署的程序會安裝在C:\Documents and Settings\用戶名\Local Settings\Apps\2.0文件夾下的一個隨機生成的目錄中。

版本升級的時候,並不會直接把老版本刪除,而是會隨機生成另外一個目錄,並且將現有的用戶數據文件原封不動的複製過去。如果需要,可以在【控制面板-添加安裝程序】中恢復到老的版本繼續使用。程序卸載的時候,這個目錄會自動被清空。

問題在於,我的這個軟件啓動後生成保存了數百個XML格式的模板文件和數據文件,大量小文件的磁盤複製操作非常耗時。開發和測試用的PC性能較好停頓還不太明顯,不湊巧用戶使用的是比較舊的筆記本電腦,結果版本升級過程變得非常明顯地緩慢。

爲了解決這個問題,可以把數據文件存放在一個獨立的文件夾中,可是在卸載的時候,由於這些數據文件不屬於ClickOnce的安裝目錄,也就不能自動刪除。如果ClickOnce部署的程序在卸載的時候,能夠調用一些自定義的處理就好了。

5,又有新問題了

有一天有個用戶搬着他的筆記本電腦來到一個窮鄉僻壤,這裏沒有寬帶,只能用一個56K的小貓上網。

當他打開軟件想工作的時候,ClickOnce提醒他,軟件有了更新的版本,你是要安裝呢還是暫時跳過?

由於對56K小貓的下載速度不太有信心,他選擇了跳過:反正軟件的舊版本也可以繼續使用,還是先完成工作要緊。

過了幾天,這個用戶回到了寬帶社會,心想現在可以升級版本了,可是當他再次打開軟件,卻沒有任何關於新版本的提示信息。

儘管我不太理解,ClickOnce就是這樣工作的:如果你選擇了【跳過】某個版本,那麼你就永遠【跳過】這個版本了,除非有比之更新的版本發佈了,ClickOnce纔會再次提醒你升級。

6,關於證書的兩個問題

第一,發佈時候用的測試用證書有個有效期問題,一年之後會導致無法繼續更新。所以我發佈之前乾脆把證書取消掉了,似乎也沒有問題,用戶安裝軟件的時候會有個警告。

第二,如果ClickOnce從https的地址更新,一定得保證服務器證書的有效性。如果從瀏覽器訪問這個網址會彈出證書有效性的警告,ClickOnce的更新會失敗。 

7,設置選項雖然多,但對應實際需求的靈活性不足

ClickOnce的高級設置選項很多。所以當初選擇用ClickOnce部署的時候沒考慮到其實這些選項的靈活性不大,很難應付實際需求,特別是碰到對操作性 愛鑽牛角尖的用戶。 不過這也是微軟產品的特性:使用方便,看似強大...不靈活

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章