.NET對(duì)軟件安裝的沖擊
2024-07-10 12:59:19
供稿:網(wǎng)友
.net對(duì)軟件安裝的沖擊
什么是.net?
…
.net是如何改變整個(gè)軟件安裝的?
.net改變了我們進(jìn)行軟件安裝的許多方式。最明顯的,我們有了新的語言c#。還有,操作系統(tǒng)也發(fā)生了微妙的變化,以及它處理共享代碼的方式。
關(guān)于元數(shù)據(jù)(metadata)
首先,你必須了解什么是managed code?所有基于微軟中間語言(msil)的代碼都是以managed code運(yùn)行的。比如.net推出的新語言c#就完全是以managed code運(yùn)行的。而其他visual studio .net附帶的語言,比如visual c++,允許managed code 和none-managed code 混合使用。
那么managed code 有什么特點(diǎn)呢?它與none-managed code 的最大區(qū)別就是包含了元數(shù)據(jù)(metadata)。元數(shù)據(jù)描述了代碼里的每一個(gè)元素,允許.net的運(yùn)行庫對(duì)其進(jìn)行管理,并使得代碼可以自描述(self-describing)。.net運(yùn)行庫通過使用元數(shù)據(jù)來提供諸如內(nèi)存管理、跨語言集成、代碼安全和對(duì)象生命周期自動(dòng)控制等等服務(wù)。簡(jiǎn)單的說,managed code就是可以與.net運(yùn)行庫以“契約合作”的方式運(yùn)行的代碼。
元數(shù)據(jù)可以包括assemblies、可裝載文件、類型、方法等等。與制作安裝關(guān)系最為密切的就是assembly manifest了。assembly是一個(gè)程序的主要組成部分,包括了所有的功能、版本信息,并作為一個(gè)整體進(jìn)行發(fā)布。每一個(gè)assembly都要包括一個(gè)assembly manifest,并使得assembly 可以自描述。manifest包括:
以文本表示的assembly 標(biāo)識(shí)、版本等,如果要與別程序共享,還要包括數(shù)字簽名。
描述包括的文件
指定assembly的類型和資源,并指明該assembly輸出哪些。
列舉所有依賴的assembly。
指明運(yùn)行需要的許可權(quán)限
manifest里也包括了以前是由自注冊(cè)(self-registration)來完成的數(shù)據(jù)。比如所有的類型信息存放在manifest里,這些manifest數(shù)據(jù)又都放在.dll或.exe文件里。這樣通過manifest我們就可以很容易的知道m(xù)anaged code 的相互依賴關(guān)系,而不會(huì)漏掉任何信息。但是,如果是managed code 和none-managed code的混合情況,就不是那么容易做到了。
如果沒有一種新的安裝技術(shù)出現(xiàn),開發(fā)者將面臨一個(gè)大難題。
對(duì)自安裝(self-installing)代碼的誤解
其中一個(gè)就是,使用managed code編寫的軟件不需要安裝。因?yàn)橐恍┌惭b的任務(wù)已經(jīng)由元數(shù)據(jù)完成了,比如com組件的注冊(cè)。只要把程序的所有文件拷貝到一個(gè)目錄下面,就可以直接運(yùn)行了。很遺憾,這并不是軟件安裝的全部過程。
軟件安裝并不是簡(jiǎn)單的把文件從位置a拷貝到位置b。軟件安裝程序應(yīng)該是給用戶提供一個(gè)友好的、可靠的和統(tǒng)一的方式,把軟件安裝到用戶的機(jī)器上面。首先,安裝程序需要通過一個(gè)統(tǒng)一的熟悉的用戶界面,讓用戶選擇安裝的選項(xiàng),然后創(chuàng)建文件夾、快捷方式,進(jìn)行升級(jí)、網(wǎng)絡(luò)安裝,還有許可證管理等等。在上面的例子里,你無法為用戶完成所有這些事情,更不用說許可證管理了。
另外,managed code 和none-managed code混合的應(yīng)用程序也不能自安裝。而且,要安裝這樣的程序比安裝純粹的none-managed code 還要麻煩。我們不可能一下子全部丟掉以前的代碼,全部轉(zhuǎn)成managed code 。所以,我們不得不認(rèn)真的考慮這個(gè)問題。
isolated applications and side-by-side components
在windows xp和.net平臺(tái)里,微軟提供了一套機(jī)制來減少dll hell的發(fā)生。我們知道,應(yīng)用程序一般都依賴于一些共享資源,所謂共享,就是說如果已經(jīng)有一個(gè)資源安裝在了系統(tǒng)上,應(yīng)用程序就不再需要安裝該資源了,直接使用就可以了。于是dll hell就這樣發(fā)生了,如果一個(gè)應(yīng)用程序需要一個(gè)比系統(tǒng)上現(xiàn)有的共享資源版本更高的資源,于是它以新的高版本的資源代替了老版本。而且有這樣的可能,新版本的資源并不能與老版本的資源相兼容。而系統(tǒng)中只能存在該資源的一個(gè)版本,所以依賴于老版本資源的應(yīng)用程序?qū)⒈罎ⅲ?br>
為了解決這個(gè)問題,微軟提供了兩種方法:isolated applications 和side-by-side components。
isolated application 就是讓應(yīng)用程序在發(fā)布的時(shí)候,附帶了該程序所有組件的隔離版本(isolated version),這樣就不會(huì)受其他安裝程序影響了。但是這需要完全重寫代碼,代價(jià)太高。
side-by-side組件就是可以在新舊版本的共享資源一起共存的環(huán)境中運(yùn)行。windows xp中的許多共享資源就是以side-by-side的方式來編寫的。開發(fā)者可以通過使用編寫application manifest來達(dá)到side-by-side 的好處。application manifest描述了程序所依賴的組件的版本信息,所以操作系統(tǒng)可以根據(jù)這些信息來裝載正確的共享資源。比如應(yīng)用程序是在comctl32的v5上進(jìn)行開發(fā)的,并在application manifest里指明了依賴于comctl32的v5版本。現(xiàn)在,即使系統(tǒng)上存在有別的版本的comctl32,操作系統(tǒng)也仍將為該程序裝載v5版本的資源。
…..