2011-11-29 36 views
3

我只是想知道如果我在Web應用程序中加載兩次相同的程序集字節會發生什麼。Assembly.Load(byte [])如何工作?

例如我有此代碼

byte[] assem = System.IO.File.ReadAllBytes(appRoot + "/Plugins/Plugin.dll"); 

var loadedAssem = Assembly.Load(assem); 

var plugin = loadedAssem.CreateInstance("Plugin.ThePlugin") as IPlugin; 

我跑這個代碼以及在所述第一請求我相信它會加載組件到RAM(或HTTP運行時應用程序域?),然後我可以創建的實例無論在那裏。

如果我再次運行此代碼,請對第二個請求說第一個請求會發生什麼情況?

公羊會存在嗎?如果是的話,它如何區分兩個議會呢?還是覆蓋以前的聲明類?

這是爲了我的理解,就像我在PHP中做的那樣,它不僅僅是一個「require_once」的情況。

回答

7

這將加載程序集的兩個不同的副本,每個都可以從您的應用程序中使用。每個程序集中的類型是不同的類型,不會相互影響。例如,如果從Copy1中獲取Widget並嘗試將其傳遞給在Copy2上使用Widget的方法,則會導致運行時失敗。這是不可能的卸載組件,一旦他們以這種方式被載入


關於實例(即到主AppDomain中。):

  • 如果使用Assembly.CreateInstance(如圖您後),這將從您用來打電話的Assembly實例創建它。
  • 如果您使用接受字符串的Activator.CreateInstance,則需要指定程序集名稱。由於這兩個加載的程序集在這種情況下將具有相同的名稱,它將使用程序集解析規則,我認爲默認情況下會支持第一次匹配(因此您首先加載的程序集)。我不確定這一點。您可以掛接AppDomain.AssemblyResolve事件以提供您自己的優先級,並使其使用您最近加載的程序集。
+0

我看到,當你說他們是不同的,如果我要加載兩個相同的程序集的副本,並創建一個像Widget類的實例..哪個程序集將實例化類? –

+0

無論你叫什麼'CreateInstance' ... –

+0

是的......我真的只是問這個嗎?已經很晚了,我應該睡覺了。好吧,如果我有這2個副本加載,我只需要使用其中一個,並有另一個卸載,我需要將它們加載到一個單獨的AppDomain和卸載該域? –