2005.2.1 歐岩亮
內容介紹
介紹Windows應用程式的配置與部署,和如何將應用程式代碼變為產品
課程基礎
熟悉Microsoft .NET Framework
瞭解基本的.NET開發和什麼是應用程式集
課程內容
配置——Configuration
設定檔
System.Configuration名稱空間
訪問註冊表
隔離儲存區 (Isolated Storage)(Isolated Storage)
部署
部署選項
私人的和共用的應用程式集
Updater Application Block
配置(Configuration)
配置應用程式有4個不同的方法:
設定檔(Config files)
一般不需要具有某些安全性,最好不要在設定檔儲存密碼,因為它是以明文存在的。如果一定要在設定檔中儲存敏感資訊,最好使用Hash等加密的方法存密文。
註冊表(Registry)
可以在註冊表上儲存敏感資訊,註冊表不僅可以儲存資訊,還可以在登錄機碼上加上存取控制清單,即ACL,保證某些人的存取權限。還可以在註冊表中儲存一些不經常改變的資訊,例如安裝的版本資訊等。
隔離儲存區 (Isolated Storage)(Isolated storage)
可以儲存一些經常變化的資訊,例如使用者在使用軟體的時候,上一次關閉程式時,工具列的布局位置、程式視窗的位置、大小等。
資料庫(Database)
比較靈活,我們呢可以任意構造資料結構。
App.config檔案
具有一定Schema的XML檔案
appSettings:添加key/value對
IDE在編譯時間將App.config拷貝到/debug或者/release的目錄當中,並將檔案名稱改為appname.exe.config(appname是我們的應用程式名稱字)
在運行時app.exe.config檔案中的配置選項被framework載入。我們可以通過appSettings中的key得到value
自訂配置選項,Custom Configuration Sections。當我們想自訂Schema的時候,framework不能自動解析我們的Schema格式,它只能替我們載入XML的node,只能是我們自己寫一個類繼承自IConfigurationSectionHandler處理我們的XML。
示範一
設定檔
cs代碼中ConfigurationSettings指的是App.config檔案,AppSettings屬性是負責讀取檔案裡的appSettings節點,它將解析這個節點裡的所有add標籤後面的所有key/value對,將這些對變成Hash表。
自訂配置選項和IConfigurationSectionHandler
<appSettings>和<add>配置塊,具有一定的局限性
可以在.config檔案頭部建立<configSections>來定義自己的配置塊
為每一個自訂的塊建立一個<section>並實現相應的handler
建立自己的section並編寫XML設定檔
建立一個類實現IConfigurationSectionHandler介面,來解析自訂格式的XML檔案
調用Configuration.GetConfig(string SectionName)方法,Framework會調用你實現的IConfigurationSectionHandler.Create()介面
示範二
自訂配置塊
下部分的DisplayBeautyTipsSection,Framework不能自動去解析,所以我們需要用下面的代碼自己實現解析
使用Config
ConfigurationSettings的GetConfig方法會去驅動Framework把App.config中名稱為DisplayBeautyTipsSection節點內容讀取到一個XML的Node裡面。之後Framework會去自動地調用App.config檔案中section標籤裡對應DisplayBeautyTipsSection名稱配置的type類的Create方法。我們這個例子中的Create方法是把XML內容作為對象原樣返回。實際運用中,我們可以不返回XML節點,而返回自訂的儲存結構,這樣我們使用起來就更方便。
註冊表
Microsoft .Win32名稱空間(這個空間裡有訪問SystemAPI的方法)
RegistryKey類:CreateSubKey(),GetSubKey(),DeleteSubKey(),GetValue(),等方法
四個主要的鍵:
Registry.LocalMachine
Registry.CurrentUser
Registry.ClassesRoot
Registry.CurrentConfig
可以在註冊表索引值上加一個Windows Access Control List(ACL)來控制註冊表鍵的安全性。添加保護許可權的時候,它的類在System.Security.Permissions.RegistryPermission…裡面定義。
示範三
註冊表訪問
隔離儲存區 (Isolated Storage)(Isolated Storage)
隔離儲存區 (Isolated Storage)可以用於儲存與使用者相關的、經常變化的資料
實際的儲存地區、路徑
支援漫遊的儲存(域儲存)
<SystemDrive>\Documents and Settings\<user>\Application Data
非漫遊的儲存路徑(本機存放區)
<SystemDrive>\Documents and Settings\<user>\Local Settings\Application Data
所有支援串列化(Serializable)的對象都可以通過Isolated Storage Stream儲存到相應的磁碟空間上
隔離儲存區 (Isolated Storage)的代碼
GetStore得到使用者隔離儲存區 (Isolated Storage)的地區,IsolatedStorageFileStream會在使用者儲存地區建立隔離儲存區 (Isolated Storage)的檔案,然後再用IFormatter串列化一些使用者資訊到檔案中。
示範四
隔離儲存區 (Isolated Storage)的代碼
在應用程式啟動的時候,讀取使用者的狀態特性,恢複上次的應用程式運行狀態
如果使用者是在域中儲存,那麼就把IsolatedStorageScope的屬性設定為Roaming,如果是本地就設定為User。通過反串列化檔案內容,得到具體的使用者特性。
這裡我們的catch不做任何事,吃掉了異常。這是一個反例,因為我們應用程式第一次啟動並執行時候,檔案Settings.isf肯定不存在,在開啟檔案並串列化的時候一定會出現異常,這個異常在這個時候是正常的,因此我們這裡吃掉異常。
關閉應用程式的時候,儲存應用程式運行狀態
這樣我們在下次運行應用程式的時候,就會讓表單大小和位置與上次關閉時一致了。
但是如果我們把應用程式拷貝一份,然後運行,表單會又回到預設位置,這說明拷貝後的應用程式屬於兩個不同的應用程式集,對於隔離儲存區 (Isolated Storage),.NET會分別對待。
而且在一個C盤非常深的目錄下我們能找到Settings.isf這個檔案
如果我們把這個檔案刪除,再運行程式,程式又會回到預設值狀態。
部署方案
Xcopy部署
安裝部署
Private和Shared的應用程式集
Side-by-side部署
Xcopy部署
Xcopy所有與應用程式相關的檔案:.exe的程式集,引用的.dll程式集(除了GAC當中的.dll檔案),和設定檔.config檔案
對於簡單的應用程式來說是個很好的選擇,安裝時不需要進行很多的配置工作
如果需要將程式集註冊到GAC當中,或應用程式需要進行大量配置,這種配置方式不適用
示範五
Xcopy部署
把Debug或Release檔案夾下的檔案拷貝到新的目錄,即可正常運行程式。
安裝部署
Setup Project模板,位於Setup and Deployment Projects
打包成.msi檔案
建立安裝嚮導
自訂安裝步驟
Installer類
在應用程式集當中添加一個Installer類
他會被自訂的安裝和部署工程或被InstallUtil.exe在進行安裝的過程中被調用
需要將這個類從System.Configuration.Install.Installer派生
重載Install方法
實現自定製的安裝代碼
Context.Parameters集合中包含了安裝時傳入的資料或參數資訊
示範六
建立Setup工程
ms-help://MS.MSDNQTR.2005JAN.1033/vsintro7/html/vbtskCreatingInstallerForYourApplication.htm
Setup工程預設情況下是不和其他工程一起編譯的,它會被跳過,因為它編譯的速度比較慢。我們可以設定解決方案的屬性來改變。
在Setup工程打上勾,就會和其他項目一起編譯了。
建立新捷徑
只有在開發環境中運行Setup程式,它才會預設的卸載以前安裝的程式,重新安裝。如果打好包之後直接運行安裝包,它會提示是否卸載,還是Repair。
如果想要修改安裝的預設路徑,需要修改Setup工程的屬性。
改為
因為在Application Folder的屬性中DefaultLocation預設路徑屬性與這個設定相關
如果想在安裝中得到使用者的輸入,可以定義一個變數CustomActionData:/ServerName=[EDITA1]。這是EDITA1的使用者輸入的值會放在ServerName變數裡面。
在UserInterface裡面定義安裝介面
這裡Edit1Property的EDITA1是和CustomActionData中的[EDITA1]名稱對應的。
添加Installer類,重載Install方法
在Installer類中,我們可以通過訪問Context.Parameters字典的"ServerName"來得到使用者輸入的值。
UpdateConfigFile類,先得到當前應用程式集,得到應用程式的設定檔,讀取設定檔,找到設定檔中連結字串的位置,並且將連接字串中Server的地方換成使用者輸入的伺服器位址。
私人和共用應用程式集
私用組件只對該應用程式的可執行代碼時可見的,通常位於可執行檔的相同目錄下
共用組件需要具有強命名(Strong Name)並且需要被安裝到Global Assembly Cache(GAC)當中
對於共用的強命名程式集來說,你可以安裝多個版本的應用程式集,實現side-by-side部署
示範七
私人的和共用的應用程式集
把產生的Northwind.snk複製到我們的工程路徑下,然後在需要強簽名的項目的AssemblyInfo裡面寫好snk檔案的路徑
C:\Windows\assembly的目錄裡面的程式集是本機電腦裡面的公有程式集。編譯成功之後,我們可以通過把編譯好的應用程式集dll放到C:\Windows\assembly的目錄裡。
我們可以把不同版本的應用程式集都放在這個目錄下,這樣在我們應用程式集升級的時候將不會影響老的應用程式。應用程式的強簽名是和程式加密沒有關係的,它只是產生了一個金鑰組,GAC通過簽名來檢測應用程式是不是同一個公司或者同一個位置來的。
Updater Application Block
“Pull模式”,這種方式可以自動的將位於中心伺服器上的應用程式集下載到本地運行
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/updater.asp
總結
.NET具有多種方式來儲存配置資料,包括設定檔、註冊表和隔離儲存區 (Isolated Storage)
可以根據不同的需要進行不同方式的部署,包括Xcopy部署,安裝部署等等
可以通過side-by-side的方式來部署應用程式集,在GAC中可以儲存多個版本的強命名的程式集
2010.10.13