2010-03-22 4 views
25

sé que hay 3 contextos de unión diferentes o contextos de carga:¿Para qué son 3 tipos de contextos vinculantes?

Load 
LoadFrom 
LoadNeither 
  1. ¿Cuáles son los contextos de carga?
  2. ¿Para qué son?
  3. ¿Por qué hacer que la carga del conjunto sea tan complicada?
  4. En "LoadNeither", "ninguno" de qué?

Gracias de antemano ...

--------------- A continuación se presentan algunas citas útiles recientemente he encontrado ----------- ---------

entender el contexto

Ningún artículo en el aglutinante es completa sin abordar contextos cargador y la razón de su existencia. Los contextos del cargador a menudo son fuente de confusión. Considere los contextos del cargador como cubos lógicos dentro de un dominio de aplicación que contiene ensamblajes. Dependiendo de cómo se carguen los ensamblajes, caen en uno de los tres contextos del cargador.

contexto Load En pocas palabras, todos los conjuntos que están presentes ya sea en el GAC, o en el ApplicationBase, o en el PrivateBinPath bajo la ApplicationBase, que se cargan usando Assembly.Load será cargada en el contexto de carga . Los ensamblados resueltos con el evento AssemblyResolve también entran en esta categoría.

contexto LoadFrom Si está intentando cargar un ensamblado al establecer una ruta específica que está fuera del ApplicationBase, y el conjunto no habría sido encontrado en el contexto de carga, a continuación, el ensamblado se carga en el contexto LoadFrom.

Ni contexto Si está intentando cargar un ensamblado utilizando Assembly.LoadFile(), Assembly.Load (byte []), o Reflection.Emit, esos conjuntos se cargan en el Ni contexto.

En el caso de conjuntos cargados en el contexto LoadFrom, el Binder primero verifica si el ensamblaje exacto (la misma identidad y ubicación) ya está presente en el contexto Cargar. Si es así, descarta la información de conjunto en el contexto LoadFrom y usa la información de conjunto del contexto Cargar. Para determinar si se trata del mismo conjunto, la información de ubicación es importante, y lo trataremos en breve. En .NET Framework 1.1, esto se conocía como el segundo enlace de LoadFrom, ya que el Binder solía realizar dos pasos: primero colocar el ensamblado en el contexto LoadFrom y luego promoverlo al contexto Cargar si encontraba una identidad de conjunto coincidente y ubicación en el contexto de carga.

Asegúrese de que el ensamblaje esté cargado en el contexto Cargar tanto como sea posible. Para esto, el ensamblado debe ser localizable desde el GAC, ApplicationBase o PrivateBinPath del AppDomain. Los ensamblados cargados en este contexto obtienen automáticamente los beneficios de NGen y las dependencias del ensamblaje presentes en este contexto se recogen automáticamente.

La carga de ensamblajes en el contexto LoadFrom tiene sus propias ventajas: permite cargar múltiples ensamblajes fuera de ApplicationBase especificando sus rutas.

Ahora, hablemos de la ubicación del conjunto, mientras identificamos si el conjunto cargado a través de LoadFrom() es el mismo que el conjunto cargado a través de Load(). Incluso si los tipos en dos ensamblajes son idénticos, si los dos ensamblajes se cargan desde diferentes rutas, no se consideran idénticos en lo que respecta a los contextos del cargador. Esto lleva a situaciones donde el mismo ensamblado se carga repetidamente en el mismo dominio de aplicación, pero en contextos diferentes (Cargar y Cargar desde) y un tipo en el conjunto en el contexto Cargar no se permitirá que sea del mismo tipo en el contexto LoadFrom (incluso si son las mismas asambleas en lo que concierne a las identidades de la asamblea). Esta es una de las desventajas de LoadFrom. Además, los ensamblados en el contexto LoadFrom no obtienen automáticamente los beneficios de NGen.

En cuanto al contexto Ni, los ensamblados en este contexto no pueden vincularse, a menos que la aplicación se suscriba al evento AssemblyResolve. Este contexto generalmente debe evitarse.

Entonces, ¿por qué el CLR tiene contextos de cargador en primer lugar? Los contextos del cargador ayudan a garantizar la independencia del orden de carga al cargar ensamblajes. Además, proporcionan una medida de aislamiento a los ensamblados y sus dependencias cuando se cargan en contextos diferentes.

- De Understanding The CLR Binder

+0

No sé por qué no puedo ver la señal de marca en el lado izquierdo de la respuesta. – smwikipedia

+2

buena pregunta, y un buen resumen de las citas. sin embargo, aún me siento confundido sobre los contextos de carga. –

+1

@AndrewGarrison En realidad, estoy confundido de nuevo ahora. ¿Microsoft no puede hacer las cosas un poco más simples? – smwikipedia

Respuesta

15

Probablemente hay sólo unas pocas personas que pueden contestar el "por qué" parte de la pregunta. Los contextos de carga principalmente tienen que ver con la forma en que están vinculadas las dependencias. Mi opinión es que:

  • Load, carga un conjunto en el AppDomain usando la ubicación "tradicional" y métodos de encuadernación. El ensamblaje cargado se puede usar como una dependencia para ensamblajes posteriores cargados en el contexto Load.
  • LoadFrom, carga un ensamblado en las dependencias AppDomain hallazgo como Load pero con una diferencia: estos grupos no se utilizarán para resolver las dependencias de Load asambleas de contexto.
  • LoadNeither carga solo ese ensamblaje. Si tiene dependencias no resueltas, tendrá que resolverlas usted mismo a través del evento AssemblyResolve.

Este es un gran blog sobre él: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx

+0

Gracias por su respuesta. Tengo una pregunta más: cuando agrego una referencia de ensamblaje en VisualStudio a través del menú contextual "agregar referencia", ¿en qué contexto se encuentra el ensamblaje al que se hace referencia? Gracias de nuevo. – smwikipedia

+0

'Carga', creo. –

+1

No hay conexión directa. Pero Agregar referencia generalmente establece la propiedad Copy Local en True para que una copia del ensamblado se coloque en la carpeta de construcción del proyecto. Lo que le da al CLR un tiempo fácil para encontrarlo, ya que es la ruta de exploración predeterminada. Carga. –

Cuestiones relacionadas