.NET對軟體安裝的衝擊
什麼是.NET?
…
.NET是如何改變整個軟體安裝的?
.NET改變了我們進行軟體安裝的許多方式。最明顯的,我們有了新的語言C#。還有,作業系統也發生了微妙的變化,以及它處理共用代碼的方式。
關於中繼資料(Metadata)
首先,你必須瞭解什麼是Managed Code?所有基於微軟中繼語言(MSIL)的代碼都是以Managed Code啟動並執行。比如.NET推出的新語言C#就完全是以Managed Code啟動並執行。而其他Visual Studio .NET附帶的語言,比如Visual C++,允許Managed Code 和None-managed Code 混合使用。
那麼Managed Code 有什麼特點呢?它與None-Managed Code 的最大區別就是包含了中繼資料(Metadata)。中繼資料描述了代碼裡的每一個元素,允許.NET的運行庫對其進行管理,並使得代碼可以自描述(Self-Describing)。.NET運行庫通過使用中繼資料來提供諸如記憶體管理、跨語言整合、代碼安全和對象生命週期自動控制等等服務。簡單的說,Managed Code就是可以與.NET運行庫以“契約合作”的方式啟動並執行代碼。
中繼資料可以包括assemblies、可裝載檔案、類型、方法等等。與製作安裝關係最為密切的就是assembly manifest了。Assembly是一個程式的主要組成部分,包括了所有的功能、版本資訊,並作為一個整體進行發布。每一個Assembly都要包括一個assembly manifest,並使得assembly 可以自描述。Manifest包括:
- 以文本表示的assembly 標識、版本等,如果要與別程式共用,還要包括數位簽章。
- 描述包括的檔案
- 指定assembly的類型和資源,並指明該assembly輸出哪些。
- 列舉所有依賴的assembly。
- 指明運行需要的許可許可權
Manifest裡也包括了以前是由自註冊(Self-Registration)來完成的資料。比如所有的類型資訊存放在Manifest裡,這些Manifest資料又都放在.DLL或.EXE檔案裡。這樣通過Manifest我們就可以很容易的知道Managed Code 的相互依賴關係,而不會漏掉任何資訊。但是,如果是Managed Code 和None-Managed Code的混合情況,就不是那麼容易做到了。
如果沒有一種新的安裝技術出現,開發人員將面臨一個大難題。
對自安裝(Self-Installing)代碼的誤解
其中一個就是,使用Managed Code編寫的軟體不需要安裝。因為一些安裝的任務已經由中繼資料完成了,比如COM組件的註冊。只要把程式的所有檔案拷貝到一個目錄下面,就可以直接運行了。很遺憾,這並不是軟體安裝的全部過程。
軟體安裝並不是簡單的把檔案從位置A拷貝到位置B。軟體安裝程式應該是給使用者提供一個友好的、可靠的和統一的方式,把軟體安裝到使用者的機器上面。首先,安裝程式需要通過一個統一的熟悉的使用者介面,讓使用者選擇安裝的選項,然後建立檔案夾、捷徑,進行升級、網路安裝,還有許可證管理等等。在上面的例子裡,你無法為使用者完成所有這些事情,更不用說許可證管理了。
另外,Managed Code 和None-managed Code混合的應用程式也不能自安裝。而且,要安裝這樣的程式比安裝純粹的None-managed Code 還要麻煩。我們不可能一下子全部丟掉以前的代碼,全部轉成Managed Code 。所以,我們不得不認真的考慮這個問題。
Isolated Applications and Side-by-Side Components
在Windows XP和.NET平台裡,微軟提供了一套機制來減少DLL Hell的發生。我們知道,應用程式一般都依賴於一些共用資源,所謂共用,就是說如果已經有一個資源安裝在了系統上,應用程式就不再需要安裝該資源了,直接使用就可以了。於是DLL Hell就這樣發生了,如果一個應用程式需要一個比系統上現有的共用資源版本更高的資源,於是它以新的高版本的資源代替了老版本。而且有這樣的可能,新版本的資源並不能與老版本的資源相相容。而系統中只能存在該資源的一個版本,所以依賴於老版本資源的應用程式將崩潰!
為瞭解決這個問題,微軟提供了兩種方法:Isolated Applications 和Side-by-Side Components。
Isolated Application 就是讓應用程式在發布的時候,附帶了該程式所有組件的隔離版本(Isolated Version),這樣就不會受其他安裝程式影響了。但是這需要完全重寫代碼,代價太高。
Side-by-Side組件就是可以在新舊版本的共用資源一起共存的環境中運行。Windows XP中的許多共用資源就是以Side-by-Side的方式來編寫的。開發人員可以通過使用編寫Application Manifest來達到Side-by-Side 的好處。Application Manifest描述了程式所依賴的組件的版本資訊,所以作業系統可以根據這些資訊來裝載正確的共用資源。比如應用程式是在COMCTL32的V5上進行開發的,並在Application Manifest裡指明了依賴於COMCTL32的V5版本。現在,即使系統上存在有別的版本的COMCTL32,作業系統也仍將為該程式裝載V5版本的資源。
…..
以上文字摘自InstallShield公司的文檔:<<The Impact of .NET on Installations>>
更多的關於軟體安裝方面的資訊,請訪問
http://www.smiling.com.cn/search/groupinfo.ecgi?group_id=24326