.Net 程序集按需加載機制

在開始本文以前先提兩個疑問:spa

1、一個.Net程序依賴不少的dll,那個他們是在應用程序啓動的時候所有把所依賴的動態庫所有都加載到應用程序域中的呢仍是有選擇的加載呢?3d

2、當應用程序已經啓動後咱們動態加載程序集的話,那麼該程序集所依賴的程序集是所有加載仍是按需加載呢?blog

 

 

 

1、分析第一個問題:io

建立三個工程ConsoleApplication1是控制檯工程,依賴於類庫ClassLibrary1,而ClassLibrary1又依賴於ClassLibrary2工程。 引用

 

  

 

 

實驗1ConsoleApplication1引用了ClassLibrary1並經過using ClassLibrary1 可是並無調用ClassLibrary1中的成員,打印出應用程序域中加載的程序集,並無把ClassLibrary1加載進來 反射

 

實驗2:把實驗1中的註釋去掉調用ClassLibrary1Class1.Print()方法,並把斷點設置在該方法上,阻止方法執行,打印出應用程序域中加載的程序集,發現ClassLibrary1已經加載j進來了,而Class1引用了CassLibrary2,但CassLibrary2並無加載程序

 

 

進入Class1.Print()方法,打印出應用程序域中加載的程序集,發現ClassLibrary2已經加載j進來了方法

 

實驗1、實驗2證實應用程序啓動後clr加載dll是按需加載的,當進入一個方法的時候,即便沒有執行該方法內的任何代碼,都會收集該方法內部用到的全部類型,並加載相應類型所在的dllim

2、分析第二個問題:動態加載

仍是上面的三個工程,改變依賴關係。ConsoleApplication1不依賴於ClassLibrary1ClassLibrary2,而ClassLibrary1 依然依賴ClassLibrary2

ConsoleApplication1要經過Assembly.LoadFrom加載ClassLibrary1觀察域中的程序集。

實驗1ConsoleApplication1項目經過Assembly.LoadFrom的方式手動加載程序集ClassLibrary1.dll,並無執行其中的代碼,打印出應用程序域中加載的程序集,發現ClassLibrary1已經加載j進來了,但ClassLibrary1所引用的ClassLibrary2並無加載進來

 

 

繼續執行經過反射調用Class.Printff方法,打印出應用程序域中加載的程序集,發現ClassLibrary2已經加載j進來了

 

因而可知動態加載程序集,在沒有調用程序集內部成員的狀況下 只加載自己,當調用內部成員的時候加載規則和clr自動加載dll是同樣的。

 

 

 

 

結論:clr加載程序集是按需加載的,當用到的時候纔會把其加載到應用程序域中。

相關文章
相關標籤/搜索