国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

是不是這個:ADO+ 引導數據種類的演變 (轉自 ms 一)

2024-07-21 02:23:49
字體:
來源:轉載
供稿:網友
利用 .net 框架簡化發布和解決 dll hell 問題
steven pratschner
microsoft corporation
2000年9月

摘要: 本文介紹匯編概念并說明 .net 框架如何使用匯編解決版本和發布問題。

目錄

簡介
問題敘述
解決方案的特性
匯編:積木
版本與共享
版本策略
發布
摘要

--------------------------------------------------------------------------------


簡介

microsoft® .net 框架介紹了幾個新功能,旨在簡化應用程序發布和解決 dll hell。最終用戶和開發人員都熟悉版本和發布問題,這些問題會伴隨著如今基于組件的系統一同出現。例如,每個最終用戶都在他們的機器上安裝了一個新的應用程序,沒料到已有應用程序神秘地停止了工作。多數開發人員花費時間使用 regedit,努力保持所有必要的注冊項一致以便激活 com 類。

.net 框架中用于解決 dll hell 問題的設計原則和實現技術是建立在 microsoft windows® 2000 的基礎上的, rick anderson 所著的 the end of dll hell(英文)和 david d'souza, bj whalen 及 peter wilson 所著的 implementing side-by-side component sharing in applications (expanded) (英文)中都有說明。.net 框架提供的許多功能都在這兩篇文章中有所描述,包括應用程序隔離和并行組件,用于建立在 .net 平臺的應用程序。您將了解 .net 平臺上提供的版本支持,它能使本地 windows 應用程序更緊密地匯集。

本文介紹了匯編的概念,并描述 .net 如何使用匯編來解決版本和發布問題。我們將特別討論匯編如何構建,如何命名以及編譯器和通用語言運行時如何使用匯編來記錄和加強應用程序片段間的版本依賴。我們也將討論應用程序和管理員如何能通過我們所稱的版本策略定制版本行為。

介紹并說明了匯編后,將展示幾個發布方案,以便使您對 .net 框架中提供的各種打包和分發選項多少有一些了解。


--------------------------------------------------------------------------------


問題敘述

版本

從客戶的角度,最常見的版本問題就是我們所說的 dll hell 問題。簡單地講, dll hell 是指當多個應用程序試圖共享一個公用組件(如某個動態連接庫(dll)或某個組件對象模型(com)類)時所引發的一系列問題。最典型的情況是,某個應用程序將要安裝一個新版本的共享組件,而該組件與機器上的現有版本不向后兼容。雖然剛安裝的應用程序運行正常,但原來依賴前一版本共享組件的應用程序也許已無法再工作。在某些情況下,問題的起因更加難以預料。比如,當用戶瀏覽某些 web 站點時會同時下載某個 microsoft activex® 控件。如果下載該控件,它將替換機器上原有的任何版本的控件。如果機器上的某個應用程序恰好使用該控件,則很可能也會停止工作。

在許多情況下,用戶需要很長時間才會發現應用程序已停止工作。結果往往很難記起是何時的機器變化影響到了該應用程序。用戶可能會回憶起一周前安裝了一些東西,但安裝與目前看到的狀態并沒有任何明顯的關聯。 更糟的是,現在很少有診斷工具幫助用戶(或幫助他們的技術支持人員)確定有什么問題。

這些問題的原因是應用程序不同組件的版本信息沒有由系統記錄或加強。而且,系統為某個應用程序所做的改變會影響機器上的所有應用程序—現在建立完全從變化中隔離出來的應用程序并不容易。

很難建立一個隔離應用程序的一個原因是當前運行時環境只允許單獨版本組件或應用程序的安裝。這個限制意味著組件的編寫者必須以向后兼容的方式編寫他們的代碼,否則當他們安裝新組件的時候會有終止已有應用程序的風險。實際上,如果可能的話,編寫永遠向后兼容的代碼是非常難的。在 .net 中,side by side 概念是版本問題的核心。"side by side" 是在同一臺機器上同時運行不同版本的相同組件的能力。使用支持并列的組件,編程人員不必努力維護嚴格的向后兼容,因為不同的應用程序自由使用某個共享組件的不同版本。

發布和安裝

現在安裝應用程序是多步過程。一般,安裝一個應用程序包括復制許多軟件組件到磁盤,和在系統中進行一系列描述那些組件的注冊項。

注冊表中的項和磁盤上文件的分隔使復制應用程序和卸載他們非常困難。而且,在注冊表中完全描述某個 com 類所需的許多項之間關系非常松散。這些項常常包括聯合類、接口、類型庫和 dcom app id 的項,不涉及任何放在注冊表文檔擴展或組件類別的項。要時常手工保持這些項的同步。

最后,需要該注冊足跡激活任何 com 類。這極大地復雜了發布分布式應用程序的過程,因為必須到每個客戶端的機器進行適當的注冊項。

如今另一個共同問題是:對一個正在運行的應用程序進行更新是不現實的。這是 web 應用程序最大的問題,web 應用程序必須停止工作然后重啟動以更新應用程序使用的 com 類。

這些問題主要由從組件自己分離傳來的組件描述引起的。換句話說,應用程序不是自描述的和獨立的。


--------------------------------------------------------------------------------


解決方案的特性

.net 框架必須提供以下基本的能力解決剛剛描述的問題:

應用程序必須是自描述的:自描述的應用程序去掉了對注冊表的依賴,能夠毫無影響的安裝和簡單的卸載和復制。


必須記錄和加強版本信息:版本支持必須建立在平臺內部以保證依賴的適當版本在運行時載入。


必須記得“上次已知的正確配置”:當應用程序成功運行時,平臺必須提供記住這套一起工作的組件的能力—包括它們的版本—。


必須支持并列組件:允許多個版本的組件同時安裝和運行在機器上,允許調用者指定他們需要載入的版本代替不知不覺被強迫的版本。.net 框架通過允許框架自己的多個版本同時存在于一臺單獨的機器上使并列鄰先了一步。這極大地簡化了升級問題,因為管理員如果需要可以選擇運行不同版本 .net 框架上的不同應用程序。


必須使應用程序隔離: .net 框架必須簡化(實際上已經默認)編寫不受機器上其他應用程序的改變影響的應用程序。

--------------------------------------------------------------------------------


匯編:積木

匯編是 .net 框架用于解決剛描述的版本和發布問題的積木。匯編是類型和資源的發布單元。在許多方面匯編和現在的 dll 相同。從本質上講,匯編是“邏輯 dll”。

匯編是通過元數據調用清單自描述的。就像 .net 使用元數據描述類型一樣,它也使用元數據描述包含類型的匯編。

匯編不僅僅于發布有關。例如,.net 中的版本在匯編層完成 —沒有任何減少,就像一個模塊或類型的版本化。而且,匯編還用于在應用程序之間共享代碼。包含某個類型的匯編是該類型標志的一部分。

訪問安全系統的代碼在其許可模型的內核中使用匯編。匯編的編寫者在清單中記錄一組運行該代碼所需求的許可,然后管理員將許可授權給基于匯編的代碼,此匯編包含該代碼。

最后,匯編也是類型系統和運行時間系統的核心,在其中他們為類型和服務建立了一個可視的邊界作為解決引用類型的運行時間范圍。

匯編清單

清單明確包括以下有關匯編數據:

標識:一個匯編標識由三部分組成:名稱、版本號和選項文化。


文件列表:清單包括所有組成匯編的文件列表。對于每個文件,在建立清單時記錄它的名稱和內容的加密信息。該信息在運行時驗證以確保發布單元的一致。


引用的匯編:匯編間的關系保存在收集的匯編清單中。從屬信息包括版本號,它用于運行時保證載入正確版本的關系。


輸出類型和資源:對類型和資源可用的可視選項包括“僅在我的匯編中可視”和“對我的匯編之外的調用者可視。”


許可需求:匯編許可需求分為三組:匯編運行需求、需要的但匯編還有一些即使沒授權的功能的需求,以及編寫者不想匯編被授權的需求。
il 反匯編 (ildasm) sdk 工具對于在匯編中查看代碼和元數據很有幫助。圖 1 是一個以 ildasm 現實的范例清單。.assembly 表示匯編而 .assembly extern 包含有關其他匯編所依賴的信息。



圖 1. 以 il 反匯編顯示的范例清單

匯編結構

到此為止,匯編主要以邏輯概念描述。本節通過描述他們如何在物理上體現幫助您使匯編更加具體。

通常,匯編由四個元素組成:匯編元數據(清單)、元數據描述類型、實現該類型的媒介語言 (il) 代碼和一組資源。不是所有的這些都出現在每個匯編中。只有清單是嚴格需要的,但類型或資源需要給匯編一些重要的功能。

有幾個關于這四個元素能如何包裝的選項。例如,圖 2 表示包含整個匯編:清單、類型元數據、il 代碼和資源。



圖 2. 包含所有匯編元素的 dll

另一種情況,一個匯編的內容也許分割為多個文件。在圖 3 中,作者選擇將一些有用的代碼分離到一個不同的 dll 中,并在它的原始文件中保留一個大的資源文件(這里是一個 jpeg 文件)。這樣做的一個原因就是優化代碼的下載。.net 框架只在引用時才下載文件,所以如果匯編包含經常被訪問的代碼或資源,那么將他們分成單獨的文件將提高下載的效率。



圖 3. 匯編元素分割為多個文件


--------------------------------------------------------------------------------


版本與共享

dll hell 一個主要目的就是共享當前在基于組件的系統中使用的模型。默認情況下,單獨的軟件組件由機器上的多個應用程序共享。例如,每次一個安裝程序復制一個 dll 到系統目錄或在 com 注冊表中注冊一個類,該代碼將潛在地影響其他運行在機器上的應用程序。實際上,如果一個已存在的應用程序使用共享組件的前一個版本,那么該應用程序將自動使用新版本。如果共享組件是嚴格向后兼容的這當然更好,但如果不可能,在許多情況下維護向后兼容是很困難的。如果沒有維持向后兼容或不能維持,作為其他應用程序安裝時的側面影響經常導致應用程序中斷。

.net 設計方針的一個原則就是隔離組件(或匯編)。隔離一個匯編的意思是一個匯編只能由一個應用程序訪問—不是由機器上的多個應用程序共享并且不可能因其他應用程序對系統的改變而影響。隔離賦予開發者對應用程序所用代碼的絕對控制。隔離,或應用程序專用匯編期望在 .net 應用程序中是默認的。隔離組件的趨勢在 microsoft windows 2000 中隨著 .local 文件的引入已經開始。該文件用于努力定位所需組件時使 os loader 和 com 首先從應用程序目錄查找。(請參閱 msdn library 中的相關文檔,implementing side-by-side component sharing in applications(英文)。)

然而,有些情況下在應用程序之間共享匯編是必要的。很明顯每個應用程序都有自己的 system.winforms、system.asp 或公用的 web 表格控件的副本是沒有意義的。

在 .net 中,在應用程序之間共享代碼是明確的決定。共享匯編需要一些附加的需求。特別是,共享匯編應該支持相同的匯編并排多個版本安裝和運行在相同的機器上,或者甚至在相同的進程中,在相同的時間。另外,共享匯編有更嚴格的命名需要。例如,一個共享的匯編必須有一個全局唯一的名稱。

隔離和共享的需要導致我們考慮兩種匯編。這是個相當松散的集合,在這兩種匯編之間沒有實際的結構,但它們如何使用是不同的:專用于某個應用程序或與許多應用程序共享。

應用程序專用匯編

應用程序專用匯編是只對某個應用程序可視的匯編。我們期望這是 .net 應用程序最普通的情況,因為 .net 框架幫助建立從其它應用程序引起的系統變化中隔離的應用程序。

專用匯編的命名需求很簡單:匯編名稱必須在應用程序中是唯一的。沒必要起全局唯一的名稱。保持名稱唯一不是問題因為應用程序開發者完全控制哪個匯編與應用程序隔離。

應用程序專用匯編部署在使用它們的應用程序目錄結構中。專用匯編可以直接放在應用程序的目錄或它的子目錄中。通用語言運行時間通過稱為 probing 的進程查找這些匯編。"probing" 是匯編名稱到包含清單的文件名稱之間的簡單映射。

特別地,通用語言運行時間把匯編的名稱記錄在匯編引用中,追加“.dll” 并在應用程序的目錄中查找該文件。該方案中有一些變量,在那里運行時間會訪問匯編命名的子目錄中或匯編的風格命名的子目錄。例如,某個開發者會選擇將包含定位于德國的資源的匯編部署在稱為“de”的子目錄中,并將西班牙的資源部署在稱為“es”的子目錄中。

如前所述,每個匯編清單包括有關其關系的版本信息。該版本信息沒有為專用匯編而加強,因為開發人員完全控制了部署到應用程序目錄的匯編。

共享匯編

.net 框架還支持共享匯編的概念。共享匯編是在機器上由多個應用程序使用的。使用 .net,共享應用程序之間的代碼是明確的決定。共享匯編有些額外的需求用于解決現在我們經歷的共享問題。除了支持早先描述的并列之外,共享匯編還有許多嚴格的命名需求。例如,共享匯編必須有一個全局唯一的名稱。而且系統必須提供“名稱保護”—更確切的說,防止有人再使用編寫者的匯編名稱。例如,假設您是一個網格控件的廠家,并且發布了您的匯編版本 1。做為編寫您需要確信沒有其他人能發布聲稱為版本 2 的匯編或您的網格控件。.net 框架支持通過稱為共享名的技術支持支持這些命名需求。(在下一節詳細說明)。

通常,應用程序編寫者不對應用程序使用的共享匯編有同等程度的控制。結果,在每次引用共享匯編時都檢查版本信息。另外,.net 框架允許應用程序和管理員通過指定版本策略重載應用程序使用的共享匯編版本。

共享匯編通常部署到全局匯編庫。全局匯編庫是供多個應用程序使用的機器范圍的匯編庫。使用該庫不是必要條件,但這樣做有很多好處。例如,自動提供多個版本的匯編并行存儲。而且,管理員能使用該庫部署他們需要的每個機器上的應用程序要使用的缺陷修復或安全補丁。在該方案中,配置匯編到全局匯編存儲能影響機器上的多個應用程序。.net 框架利用版本政策(稍候描述)的概念解決了現在出現在系統中共享區域的問題,例如 %windir%/system32。

在庫中添加匯編需要明確的管理員操作—實際上,安裝過程必須有“管理員權限”。匯編從不在存儲結束作為運行一個應用程序的側面影響,也不是當前工作的共享匯編的任何存儲。在 visual studo .net 時間框架中,windows 安裝程序將更新為理解匯編和匯編庫。這意味著可以使用 windows 安裝程序的所有功能,例如使用 .net 應用程序選擇安裝和應用程序恢復。

.net sdk 包括兩個用于匯編庫的工具。第一個是稱為 al 的工具,它允許在庫中添加匯編。al 使開發和測試方案變得方便,它不需要創建整個 windows 安裝程序包在庫中添加一個匯編。使用 /install 開關在庫中添加匯編:

al /install:myassembly.dll  
第二個工具是 windows shell extension,它允許您使用 windows explorer 操作庫。圖 4 表示全局匯編庫的視圖。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 温州市| 额济纳旗| 大英县| 阳原县| 昌图县| 宿迁市| 秭归县| 天祝| 德阳市| 拉萨市| 德清县| 祁东县| 华宁县| 当涂县| 高雄市| 旬邑县| 汕头市| 衡阳市| 祁东县| 繁昌县| 秦皇岛市| 平乡县| 浦县| 呼和浩特市| 汉源县| 年辖:市辖区| 澳门| 福建省| 恩平市| 曲沃县| 河源市| 舒兰市| 册亨县| 固原市| 琼海市| 卢湾区| 西林县| 隆化县| 藁城市| 闽清县| 尼勒克县|