2010-03-22 45 views
25

我知道有3個不同的結合上下文或負載背景:什麼是3種綁定上下文?

Load 
LoadFrom 
LoadNeither 
  1. 什麼是負載環境?
  2. 它們是幹什麼用的?
  3. 爲什麼使組件加載如此複雜?
  4. 在「LoadNeither」中,「既不是」什麼?

在此先感謝...

---------------以下是一些有用的報價我最近發現----------- ---------

瞭解情況

在粘合劑上沒有文章是不完整的解決裝載機背景和其存在的理由。加載器上下文往往是混淆的根源。將加載器上下文想象爲包含程序集的應用程序域內的邏輯存儲區。根據程序集的加載方式,它們可能屬於三種加載器上下文中的一種。

加載上下文簡單地說,是存在或者在GAC,或在ApplicationBase,或在ApplicationBase下PrivateBinPath,正在使用Assembly.Load加載將在Load上下文加載所有組件。使用AssemblyResolve事件解決的組件也屬於此類別。

LoadFrom上下文如果您正試圖通過提供是ApplicationBase之外的特定路徑來加載組件和組件將不會被在Load上下文中找到,然後將組件加載到LoadFrom上下文。

既不上下文如果正在試圖加載使用Assembly.LoadFile()的組件,Assembly.Load(字節[]),或Reflection.Emit的,這些組件被加載到既不上下文。

在加載到LoadFrom上下文中的程序集的情況下,Binder首先檢查確切的程序集(相同的標識和位置)是否已經存在於Load上下文中。如果是,它會丟棄LoadFrom上下文中的程序集信息並使用Load上下文中的程序集信息。在確定它是否是相同的裝配體時,位置信息很重要,我們稍後會介紹。在.NET Framework 1.1中,這被稱爲LoadFrom的第二個綁定,因爲Binder用於執行兩個步驟 - 首先將程序集放置在LoadFrom上下文中,然後將它提升到Load上下文(如果它找到匹配的程序集標識並且位於Load環境中。

確保程序集儘可能加載到Load上下文中。爲此,程序集應該可以從GAC,ApplicationBase或AppDomain的PrivateBinPath中進行定位。加載到此上下文中的程序集會自動獲得NGen的好處,並且會自動拾取此上下文中存在的程序集依賴關係。

將程序集加載到LoadFrom上下文中有其自身的優勢 - 它允許通過指定其路徑來加載ApplicationBase之外的多個程序集。

現在,讓我們談談組件的位置,同時確定通過LoadFrom()加載的程序集是否與通過Load()加載的程序集相同。即使兩個程序集中的類型相同,如果兩個程序集是從不同的路徑加載的,就加載程序上下文而言,它們不會被視爲相同。這會導致在同一個應用程序域中重複加載相同程序集但加載到不同上下文(Load和LoadFrom)中並且Load上下文中的程序集中的類型不允許爲LoadFrom上下文中的相同類型的情況(就組裝標識而言,即使它們是相同的組件)。這是LoadFrom的缺點之一。此外,LoadFrom上下文中的程序集不會自動獲得NGen的好處。

對於Neither上下文,除非應用程序訂閱AssemblyResolve事件,否則不能綁定此上下文中的程序集。通常應避免這種情況。

那麼爲什麼CLR首先要有加載器上下文?加載程序上下文有助於確保加載程序集時的加載順序獨立性。另外,它們在裝入不同上下文時提供了對程序集及其依賴關係的隔離度量。

- 從Understanding The CLR Binder

+0

我不知道爲什麼我看不到對答案的左側的標誌信號。 – smwikipedia 2010-04-13 04:21:08

+2

很好的問題,以及很好的報價總結。不過,我仍然覺得大多對加載上下文感到困惑。 – 2010-11-15 15:47:22

+1

@AndrewGarrison其實我現在又困惑了。微軟不能讓事情變得簡單一點嗎? – smwikipedia 2014-04-01 16:02:38

回答

15

有可能只有少數人誰可以回答這個問題的「爲什麼」的一部分。負載上下文主要與依賴關係如何綁定有關。我的理解是:

  • Load,採用「傳統」的位置,並結合方法加載組件進入AppDomain。加載的程序集可用作Load上下文中加載的後續程序集的依賴項。
  • LoadFrom,將程序集加載到AppDomain找到依賴關係,如Load,但有一點不同:這些程序集將不會用於解決Load上下文程序集的依賴關係。
  • LoadNeither只裝載一個組件。如果它具有未解決的依賴關係,則需要通過AssemblyResolve事件自行解決它們。

這是關於一個偉大的博客: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx

+0

感謝您的回覆。我還有一個問題:當我通過「添加引用」上下文菜單在VisualStudio中添加程序集引用時,引用的程序集在什麼上下文中?再次感謝。 – smwikipedia 2010-03-22 16:38:40

+0

'加載',我相信。 – 2010-03-22 16:44:14

+1

沒有直接的聯繫。但「添加引用」通常會將「複製本地」屬性設置爲True,以便將該程序集的副本放入項目構建文件夾中。這使得CLR很容易找到它,因爲它是默認的探測路徑。加載。 – 2010-03-22 16:49:44