反射 6 程式集載入上下文

2022-01-12 20:39:33 字數 2626 閱讀 2309

1.四種程式集載入到上下文及優缺點:

1)預設載入上下文

載入上下文包含通過探測全域性程式集快取、主機程式集儲存區(如果承載執行時)以及應用程式域的

和privatebinpath

所找到的程式集。比如

load()

使用程式集標識的過載。(探測規則請參見:《(5)clr 執行時探測程式集引用的步驟》 )

使用預設載入上下文具有以下缺點:

a)載入到其他上下文中的依賴項不可用。

b)不能將探測路徑外部的位置的程式集載入到預設載入上下文中。

2)載入位置上下文

可以從未位於應用程式路徑下(並因此未包含在探測中)的某個路徑引導程式集。載入位置上下文允許從該路徑查詢和載入依賴項,因為路徑資訊由上下文維護。

此上下文中的程式集可以使用載入到預設載入上下文中的依賴項。

通過使用

assembly.loadfrom

方法或按路徑載入的其他方法之一來引導程式集具有以下缺點:

a)如果已載入乙個具有相同標識的程式集,則即使指定了不同的路徑,

loadfrom

仍返回已載入的程式集。

b)如果用

loadfrom

載入乙個程式集,隨後預設載入上下文中的乙個程式集嘗試按顯示名稱載入同一程式集,則載入嘗試將失敗。對程式集進行反序列化時,可能發生這種情況。

c)如果用

loadfrom

載入乙個程式集,並且探測路徑包括乙個具有相同標識但位置不同的程式集,則會發生切換到預設上下文的情況,這樣會有損耗效能。

d)loadfrom

要求指定路徑中包含

fileiopermissionaccess.read

和fileiopermissionaccess.pathdiscovery

或webpermission。e)

如果存在程式集的本機映像,將不會使用它。

f)程式集不能以非特定域的方式載入。

3)只反射上下文

使用reflectiononlyload

和reflectiononlyloadfrom

方法載入的程式集;無法執行這些上下文中的**。

該上下文通常用於檢查無法載入執行的**,可以

a)跳過程式集強命名認證。

b)跳過處理器架構檢查規則。

4)無上下文

在沒有上下文的情況下進行載入是將具有同一標識的多個程式集載入到乙個應用程式域中的唯一方式。這將省去探測成本。

此上下文中的程式集可以使用載入到預設載入上下文中的依賴項。

a)使用反射發出生成的瞬態程式集。

b)從位元組陣列載入的程式集。(如果載入到的程式集標識(在應用策略後建立的)與全域性程式集快取中的程式集標識匹配,將會從全域性程式集快取引導程式集,這時是載入到「預設載入上下文」中)

c)loadfile

方法按照目標程式集的檔案路徑載入該程式集。

在沒有上下文的情況下引導程式集具有以下缺點:

a)無法將其他程式集繫結到在沒有上下文的情況下載入的程式集,除非您處理

事件。b)

不會自動載入依賴項。您可以在沒有上下文的情況下預載入依賴項、將依賴項預載入到預設載入上下文中或通過處理

事件來載入依賴項。

c)在沒有上下文的情況下載入具有同一標識的多個程式集會導致出現型別標識問題。

d)如果存在程式集的本機映像,將不會使用它。

e)程式集不能以非特定域的方式載入。

2.避免將乙個程式集載入到多個上下文中

將乙個程式集載入到多個上下文中會導致出現型別標識問題。將同乙個程式集中的相同型別載入到兩個不同的上下文中,就像是載入具有相同名稱的兩個不同的型別一樣。如果您嘗試將乙個型別強制轉換為另乙個型別,則將引發

invalidcastexception

,並顯示一條令人混淆的訊息,指示不能將型別

mytype

強制轉換為型別

mytype

(執行時會將這兩個程式集副本中的

mytype

視為不同的型別)。

另:將乙個程式集的多個版本載入到同一種上下文中也會導致出現型別標識問題。

3.考慮切換到預設載入上下文

檢查應用程式的程式集載入和部署模式。是否能夠消除從位元組陣列載入的程式集?是否能夠將程式集移動到探測路徑中?如果程式集位於全域性程式集快取中或應用程式域的探測路徑(即

和privatebinpath

)中,則可以按照程式集的標識來引導程式集。

如果無法將所有程式集放入探測路徑中,請考慮替代方式,例如使用

.net framework

外接程式模型、將程式集放置到全域性程式集快取中或建立應用程式域。

現在我們已經了解了各種程式集上下文,那麼這些上下問和.net中提供的方法又如何對應呢?請參見: 《(7)動態程式集載入load()》 

《反射機制》系列:

(1)程式集基礎知識

(2)強名稱程式集與數字證書

(3)程式集載入 assembly類

(4)繫結程式集配置策略

(5)clr 執行時探測程式集引用的步驟

(6)程式集載入上下文

(7)動態程式集載入load()

(8)程式集反射 type 類

(9)程式集的載入和反射

參考資源:

適用於程式集載入的最佳做法

反射 6 程式集載入上下文

1.四種程式集載入到上下文及優缺點 1 預設載入上下文 載入上下文包含通過探測全域性程式集快取 主機程式集儲存區 如果承載執行時 以及應用程式域的 和privatebinpath 所找到的程式集。比如 load 使用程式集標識的過載。探測規則請參見 5 clr 執行時探測程式集引用的步驟 使用預設載...

tomcat載入專案上下文

注 tomcat安裝目錄 b.server.xml 和 conf catalina localhost目錄下的區別。1.如果server.xml檔案沒有配置 而是在 conf catalina localhost目錄下配置乙個a.xml檔案,裡面的內容為 則tomcat直接載入 a.xml檔案。2....

程式的上下文

一 含義 上下文有程式執行所需要的全部資源和資料 包括函式資料 構成。程式執行的過程就是構建上下文和使用上下文進行解釋和處理的過程。上下文的構建和維護構成了乙個解釋系統的小宇宙,任何事件 過程 元素,只有進入這個上下文才會有含義。程式的執行依賴於上下文,程式執行的一半工作是執行上下文的構建與維護。二...