Estaba mirando la documentación de msdn y todavía estoy un poco confundido sobre cuál es exactamente la diferencia entre usar LoadFile
y LoadFrom
al cargar un ensamblaje. ¿Alguien puede proporcionar un ejemplo o una analogía para describirlo mejor? La documentación de MSDN me confundió más. Además, es ReflectionOnlyLoadFrom
igual que LoadFrom
excepto que carga el ensamblaje solo en modo de reflexión.
Dado que mi experiencia .NET no es la mejor, aquí hay algunas preguntas sobre la documentación de MSDN con LoadFile:
1) ¿Qué significa LoadFile
examinar asambleas que tienen la misma Identidad, pero están ubicadas en diferentes rutas? ¿Cuál es la identidad (ejemplo)?
2) Establece LoadFile
que no carga archivos en el 'Contexto LoadFrom' y no resuelve dependencias usando la ruta de carga. ¿Qué significa esto, alguien puede dar un ejemplo?
3) Por último, afirma que LoadFile
es útil en este escenario limitado porque LoadFrom no puede cargar ensamblajes que tienen las mismas identidades pero diferentes rutas; solo cargará el primer conjunto de este tipo, lo que nuevamente me lleva a la misma pregunta, ¿cuál es la identidad de los conjuntos?
Respuestas:
¿Esto lo aclara?
Editar : para responder las preguntas que planteó en su pregunta revisada, definitivamente desea leer a Suzanne Cook sobre Identidad de la Asamblea .
Hay muchas reglas que rigen cómo se cargan los ensamblajes, y algunos de ellos tienen que ver con cómo resuelven las dependencias. En la Caché de ensamblados global, ¿el mismo directorio que encontró Ensamblado A, o en otro lugar completamente diferente? Además, si encuentra varias copias de ese ensamblaje, ¿cómo debería elegir cuál usar?
LoadFrom
tiene un conjunto de reglas, mientras queLoadFile
tiene otro conjunto de reglas. Es difícil imaginar muchas razones para usarLoadFile
, pero si necesita usar la reflexión en diferentes copias del mismo ensamblaje, está ahí para usted.fuente
string.Compare(x, y) == 0
? Creo que quieresx == y
allí? Si, por razones oscuras, desea un control de igualdad dependiente de la cultura, es más claro escribirstring.Equals(x, y, StringComparison.CurrentCulture)
, por ejemplo.Del blog de Suzanne Cook :
Ver aquí .
Consulte también el artículo Elección de un contexto vinculante en el mismo blog.
fuente
Después de mucho rascarme la cabeza, he descubierto una diferencia esta tarde.
Quería cargar una DLL en tiempo de ejecución, y la DLL vivía en otro directorio. Esa DLL tenía sus propias dependencias (DLL) que también vivían en ese mismo directorio.
LoadFile (): cargó la DLL específica, pero no las dependencias. Entonces, cuando se realizó la primera llamada desde la DLL a una de esas otras DLL, arrojó una excepción FileNotFoundException.
LoadFrom (): cargó la DLL que especifiqué y también todas las dependencias que vivían en ese directorio.
fuente
FileNotFoundException
cuando creaba una nueva instancia de un objeto definido en un ensamblaje al que hacía referencia el ensamblaje con el que acababa de cargar.LoadFile
. Cambiando esto a.LoadFrom
parece que soluciona el problema, ¡pero no sabía por qué! GraciasNota: Si se carga un ensamblaje utilizando una ruta 8.3 y luego desde una ruta que no sea 8.3, se verán como ensamblajes diferentes, aunque sean la misma DLL física.
fuente
.NET tiene un contexto de carga diferente. Suzanne Cook escribió sobre ellos aquí: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx
Esta es la forma en que .Net pone en cuarentena que las referencias no se mezclan.
fuente
Una diferencia que noté es:
Assembly.LoadFile : carga el ensamblaje en diferentes AppDomain con derechos de usuario limitados (principio de diferencia). operaciones como la serilización / deserilización no se pudieron realizar.
Assembly.LoadFrom : carga el ensamblaje en el mismo AppDomain con los mismos derechos de usuario (mismo principio).
fuente
En mi caso, solo tuve que eliminar simplemente la caché de la aplicación ASP ubicada @
C:\Windows\Microsoft.NET\Framework\[asp version]\Temporary ASP.NET Files
. Se reconstruye cuando el sitio se ejecuta por primera vez. Asegúrese de detener IIS primero.Espero que esto ayude a alguien como lo hizo por mí.
fuente