2010-03-19 5 views

Respuesta

51

.NET Framework aplaza la carga de ensamblajes en el AppDomain actual hasta que se necesiten. Por ejemplo, si llama a una biblioteca de terceros solo desde SomeMethod(), la DLL de terceros normalmente no se cargará hasta la primera vez que se ejecute SomeMethod().

AppDomain.GetAssemblies() le proporciona todos los ensamblajes que ya se han cargado en el dominio de aplicación actual. BuildManager.GetReferencedAssemblies() devuelve una lista de todos los ensamblados a los que se hace referencia desde Web.config y en otros lugares, y carga esos ensamblajes en el AppDomain actual.

Aquí hay un ejemplo resuelto de lo anterior.

  1. SomeMethod() aún no se ha ejecutado.
  2. Llamar a AppDomain.GetAssemblies(), devuelve un conjunto que no incluye ThirdParty.dll.
  3. Llamar SomeMethod().
  4. Llamar a AppDomain.GetAssemblies(), devuelve un conjunto que incluye ThirdParty.dll.

En este ejemplo, CLR aplaza cargar ThirdParty.dll en el AppDomain actual hasta que sea absolutamente necesario. Y dado que es necesario para la ejecución de SomeMethod(), es cuando se carga.

Alternativamente:

  1. SomeMethod() todavía no se ha ejecutado.
  2. Llamar a AppDomain.GetAssemblies(), devuelve un conjunto que no incluye ThirdParty.dll.
  3. Llamar a BuildManager.GetReferencedAssemblies(), devuelve un conjunto que incluye ThirdParty.dll.
  4. Llamar a AppDomain.GetAssemblies(), devuelve un conjunto que incluye ThirdParty.dll.

Aquí, aunque nunca llamó a SomeMethod(), la llamada a BuildManager.GetReferencedAssemblies() cargó la biblioteca de terceros en el dominio de aplicación actual en su nombre.

Por supuesto, esto está sujeto a ciertas optimizaciones, etc., pero la idea general es válida.

+1

¿Entonces la única manera de obtener un control de BuildManager es haciendo referencia a System.Web.dll? Suena un poco raro – Ted

+0

@Ted ¿Qué pasa con esto? Simplifiqué bastante en mi respuesta anterior, pero el concepto de BuildManager solo tiene sentido en una aplicación ASP.NET. – Levi

+1

sí, hacer referencia a System.Web.dll y usar BuildManager arrojará una excepción si no es un proyecto de ASP.NET. En WinForms no puedes hacer esto. – Ted