.NET 動態載入程式集 (一) (轉)

worldblog發表於2008-01-21
.NET 動態載入程式集 (一) (轉)[@more@]

我們先來看中與本幾個重要的概念:

(1)應用域,由 Appain 來表示,為託管程式碼提供隔離、解除安裝和邊界。多個應用程式域可以在一個程式中執行;但是,在應用程式域和執行緒之間沒有一對一的關聯。多個執行緒可以屬於一個應用程式域,儘管給定的執行緒並不侷限於一個應用程式域,但在任何給定時間,執行緒都在一個應用程式域中執行。應用程式域透過使用 方法來建立。AppDomain 例項用於載入和執行程式集 ()。當不再使用 AppDomain 時,可以將它解除安裝。AppDomain 類實現一組事件,這些事件使應用程式可以在載入程式集、解除安裝應用程式域或引發未處理的異常時進行響應。

(2)程式集是 應用程式的生成塊;程式集構成了部署、版本控制、重複使用、啟用範圍控制和安全的基本單元。程式集是為協同工作而生成的型別和資源的集合,這些型別和資源構成了一個邏輯功能單元。程式集為公共語言執行庫提供它要用於識別型別實現的資訊程式集旨在簡化應用程式部署並解決在基於的應用程式中可能出現的版本控制問題ms-help://MS.NETSDK.CHS/cpgunf/html/cpconwhyuseassemblies.htm

程式集可以是靜態的或動態的。靜態程式集可以包括 .NET 框架型別(介面和類),以及該程式集的資源(點陣圖、JPEG 、資原始檔等)。靜態程式集以 PE 檔案格式在上。您還可以使用 .NET 框架來建立動態程式集,動態程式集直接從執行並且在執行前不儲存到磁碟上。您可以在執行動態程式集後將它們儲存在磁碟上。

(3)執行庫如何定位程式集

若要成功地部署 .NET 框架應用程式,必須瞭解公共語言執行庫如何定位和繫結組成應用程式的程式集。預設情況下,執行庫試圖與生成應用程式使用的程式集的原版本繫結。這種預設行為可以由檔案設定覆蓋。

在試圖定位程式集並解析程式集引用時,公共語言執行庫將執行若干個步驟。以下幾節中對每個步驟進行了解釋。當描述執行庫如何定位程式集時,通常使用“探測”一詞;它是指基於名稱和區域性定位程式集時使用的一組試探法。

(使用包含在 .NET 框架 SDK 中的程式集繫結日誌檢視器 (Fuslogvw.exe),來檢視日誌檔案中的繫結資訊)

當執行庫試圖解析對另一個程式集的引用時,就開始進行定位並繫結到程式集的程式。該引用可以是靜態的,也可以是動態的。在生成時,在程式集清單的後設資料中記錄靜態引用。動態引用是由於各種方法而動態構造的,例如 System.Reflection.Assembly.Load 方法。

引用程式集的首選方式就是使用完全引用,包括程式集名稱、版本、區域性和公鑰標記(如果存在)。執行庫就會按照本節後面描述的步驟,使用這些資訊來定位程式集。無論引用是對靜態程式集的引用還是對動態程式集的引用,執行庫均使用相同的解析過程。

還可透過向呼叫方法僅提供有關程式集的部分資訊的方式(例如僅指定程式集名稱),對程式集進行動態引用。在這種情況下,僅在應用程式目錄下搜尋程式集,不進行其他檢查。您可以使用不同載入程式集方法中的任何方法(例如 System.Reflection.Assembly.Load 或 AppDomain.Load)進行部分引用。如果希望執行庫在全域性程式集快取和應用程式目錄下檢查引用的程式集,可以用 System.Reflection.Assembly.LoadWithPartialName 方法指定部分引用。有關部分繫結的更多資訊,請參閱。

最後,可以使用諸如 System.Reflection.Assembly.Load 之類的方法進行動態引用並只提供部分資訊;然後在應用程式配置檔案中用 元素限定該引用。該元素使您可以在應用程式配置檔案中而不是在程式碼中提供完全引用資訊,包括名稱、版本、區域性和公鑰標記(如果適用)。如果要在應用程式目錄外完全限定對某個程式集的引用,或者如果要引用全域性程式集快取中的程式集,但又希望方便地在配置檔案中而不是在程式碼中指定完全引用,就可以採用這一技術。

注意 此型別的部分引用不應用於幾個應用程式共享的程式集。因為配置設定是應用於每一應用程式而不是每一個程式集的,所以使用此型別部分引用的共享程式集將要求使用該共享程式集的每一應用程式都要在其配置檔案中具有限定資訊。

執行庫使用以下步驟來解析程式集引用:

1.透過檢查適用的配置檔案(包括應用程式配置檔案、發行者策略檔案和配置檔案),。如果配置檔案位於計算機上,則執行庫必須首先定位和應用程式配置檔案。

2.,如果已繫結,則使用以前載入的程式集。

3.。如果在其中找到了程式集,則執行庫使用該程式集。

4.按以下步驟:

a.如果配置策略和發行者策略不影響原始引用,並且繫結請求是使用 Assembly.LoadFrom 方法建立的,則執行庫檢查位置提示。

b.如果在配置檔案中找到了程式碼基,則執行庫只檢查該位置。如果該探測失敗,則執行庫確定繫結請求已失敗,並且不再進行其他的探測。

c.使用中描述的試探法探測程式集。如果探測後沒有找到程式集,則執行庫請求 程式提供程式集。它用作一個即需即裝功能。

注意 不對沒有強名稱的程式集進行版本檢查,並且執行庫也不在全域性程式集快取中檢查沒有強名稱的程式集。

 :namespace prefix = o ns = "urn:schemas--com::office" />


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-997897/,如需轉載,請註明出處,否則將追究法律責任。

相關文章