Разница между AppDomain.GetAssemblies и BuildManager.GetReferencedAssemblies - PullRequest
31 голосов
/ 19 марта 2010

Просто хотел узнать, есть ли разница между ними в контексте полностью доверенного приложения asp.net mvc 2.

1 Ответ

57 голосов
/ 19 марта 2010

.NET Framework откладывает загрузку сборок в текущий домен приложений до тех пор, пока они не понадобятся. Например, если вы вызываете стороннюю библиотеку только из SomeMethod (), сторонняя DLL обычно не загружается до тех пор, пока SomeMethod () не запустится.

AppDomain.GetAssemblies () предоставляет вам все сборки, которые уже были загружены в текущий AppDomain. BuildManager.GetReferencedAssemblies () возвращает список всех сборок, на которые есть ссылки в Web.config и других местах, и загружает эти сборки в текущий домен приложения.

Вот отработанный пример вышесказанного.

  1. SomeMethod () еще не запущен.
  2. Call AppDomain.GetAssemblies (), возвращает набор, который не включает ThirdParty.dll.
  3. Вызов SomeMethod ().
  4. Вызовите AppDomain.GetAssemblies (), возвращает набор, включающий ThirdParty.dll.

В этом примере CLR откладывает загрузку ThirdParty.dll в текущий домен приложений, пока это не станет абсолютно необходимым. И поскольку это необходимо для выполнения SomeMethod (), именно тогда он загружается.

В качестве альтернативы:

  1. SomeMethod () еще не запущен.
  2. Вызовите AppDomain.GetAssemblies (), возвращает набор, который не включает ThirdParty.dll.
  3. Вызовите BuildManager.GetReferencedAssemblies (), возвращает набор, включающий ThirdParty.dll.
  4. Вызовите AppDomain.GetAssemblies (), возвращает набор, включающий ThirdParty.dll.

Здесь, даже если вы никогда не вызывали SomeMethod (), вызов BuildManager.GetReferencedAssemblies () загрузил стороннюю библиотеку в текущий домен приложений от вашего имени.

Конечно, все это подлежит определенной оптимизации и т. Д., Но общая идея верна.

...