c# - situacional - tipos de contexto semantico
¿Para qué son los 3 tipos de contextos de enlace? (1)
Sé que hay 3 contextos de enlace diferentes o contextos de carga:
Load
LoadFrom
LoadNeither
- ¿Qué son los contextos de carga?
- ¿Para qué son?
- ¿Por qué hacer el montaje tan complicado de cargar?
- En "LoadNeither", "ninguno" de qué?
Gracias por adelantado...
--------------- A continuación hay algunas citas útiles que encontré recientemente --------------------
Entender el contexto
Ningún artículo en The Binder está completo sin abordar los contextos del cargador y la razón de su existencia. Los contextos del cargador son a menudo la fuente de confusión. Piense en los contextos del cargador como grupos lógicos dentro de un dominio de aplicación que contienen ensamblajes. Dependiendo de cómo se cargaron los ensamblajes, se ubican en uno de los tres contextos del cargador.
Cargar contexto En pocas palabras, todos los ensamblajes que están presentes en GAC, en ApplicationBase o en PrivateBinPath bajo ApplicationBase, que se cargan con Assembly.Load se cargarán en el contexto de Load. Los ensamblajes resueltos con el evento AssemblyResolve también entran en esta categoría.
Contexto de LoadFrom Si está intentando cargar un conjunto proporcionando una ruta específica que está fuera de ApplicationBase, y el conjunto no se habría encontrado en el contexto de Carga, entonces el conjunto se carga en el contexto de LoadFrom.
Ninguno de los dos contextos Si está intentando cargar un ensamblaje utilizando Assembly.LoadFile (), Assembly.Load (byte []) o Reflection.Emit, esos ensamblados se cargan en el contexto Ninguno.
En el caso de ensamblajes cargados en el contexto de LoadFrom, el cuaderno primero comprueba si el ensamblaje exacto (la misma identidad y ubicación) ya está presente en el contexto de carga. Si es así, descarta la información de ensamblaje en el contexto de LoadFrom y utiliza la información de ensamblaje del contexto de carga. Al determinar si se trata del mismo ensamblaje, la información de ubicación es importante y lo cubriremos 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 ensamblaje en el contexto LoadFrom, y luego promoverlo en el contexto de Carga si encontraba una identidad de ensamblaje coincidente Ubicación en el contexto de carga.
Asegúrese de que el ensamblaje esté cargado en el contexto de Carga tanto como sea posible. Para esto, el ensamblaje debe ser localizable desde GAC, ApplicationBase o PrivateBinPath del dominio de aplicación. Los ensamblajes 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 de LoadFrom tiene sus propias ventajas: permite que se carguen múltiples ensamblajes fuera de ApplicationBase especificando sus rutas.
Ahora, hablemos de la ubicación del ensamblaje, mientras identificamos si el ensamblaje cargado a través de LoadFrom () es el mismo que el ensamblado cargado a través de Load (). Incluso si los tipos en dos conjuntos son idénticos, si los dos conjuntos se cargan desde diferentes rutas, no se consideran idénticos en lo que respecta a los contextos del cargador. Esto conduce a situaciones en las que el mismo ensamblaje se carga repetidamente en el mismo dominio de aplicación, pero en diferentes contextos (Load y LoadFrom) y un tipo en el ensamblado en el contexto de Carga no podrá ser del mismo tipo en el contexto de LoadFrom ( incluso si son los mismos conjuntos en lo que se refiere a las identidades del conjunto). Esta es una de las desventajas de LoadFrom. Además, los ensamblajes en el contexto de LoadFrom no obtienen automáticamente los beneficios de NGen.
En cuanto al contexto Ninguno, los ensamblajes en este contexto no pueden vincularse, a menos que la aplicación se suscriba al evento AssemblyResolve. Este contexto generalmente debe ser evitado.
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 ensamblajes y sus dependencias cuando se cargan en contextos diferentes.
Probablemente hay solo unas pocas personas que pueden responder la parte de la pregunta "por qué". La mayoría de los contextos de carga tienen que ver con cómo se enlazan las dependencias. Mi entendimiento es que:
-
Load
, carga un ensamblaje en elAppDomain
usando métodos de enlace y ubicación "tradicionales". El conjunto cargado se puede utilizar como una dependencia para los conjuntos posteriores cargados en el contexto deLoad
. -
LoadFrom
, carga un conjunto en las dependencias de búsqueda deAppDomain
como laLoad
pero con una diferencia: estos conjuntos no se utilizarán para resolver las dependencias de los conjuntos de contexto deLoad
. -
LoadNeither
carga solo ese ensamblaje. Si tiene dependencias sin resolver, deberá resolverlas usted mismo a través del eventoAssemblyResolve
.
Este es un gran blog al respecto: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx