Diferencia entre LoadFile y LoadFrom with.NET Asambleas?


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 ensamblado. ¿Puede alguien dar un ejemplo o una analogía para describirlo mejor? La documentación de MSDN me confundió más. También, es ReflectionOnlyLoadFrom lo mismo que LoadFrom excepto que carga el ensamblaje solo en modo de reflexión.

Dado que mi experiencia en. NET no es la mejor, aquí hay algunas preguntas sobre la documentación de MSDN que utiliza Archivo de carga:

1) ¿Qué quiere decir con LoadFile examina asambleas que tienen la misma Identidad, pero están ubicadas en caminos diferentes? ¿Cuál es la identidad (ejemplo)?

2) Indica que el LoadFile no carga archivos en el 'Contexto LoadFrom' y no resuelve dependencias usando la ruta de carga. ¿Qué significa esto, puede alguien dar un ejemplo?

3) Por último, establece que LoadFile es útil en este escenario limitado porque LoadFrom no puede cargar ensamblajes que tengan la las mismas identidades pero caminos diferentes; solo cargará la primera asamblea de este tipo, lo que de nuevo me lleva a la misma pregunta, ¿qué es la identidad de las asambleas?

Author: Ruben Bartelink, 2009-09-25

8 answers

¿Esto lo aclara?

// path1 and path2 point to different copies of the same assembly on disk:

Assembly assembly1 = Assembly.LoadFrom(path1);
Assembly assembly2 = Assembly.LoadFrom(path2);

// These both point to the assembly from path1, so this is true
Console.WriteLine(assembly1.CodeBase == assembly2.CodeBase);

assembly1 = Assembly.LoadFile(path1);
assembly2 = Assembly.LoadFile(path2);

// These point to different assemblies now, so this is false
Console.WriteLine(assembly1.CodeBase == assembly2.CodeBase);

Editar: para responder a las preguntas que planteó en su pregunta revisada, definitivamente desea leer Suzanne Cook sobre la Identidad de la Asamblea.

Hay muchas reglas que gobiernan cómo se cargan los ensamblados, y algunas de ellas tienen que ver con cómo resuelven las dependencias - si tu AssemblyA es dependiente de AssemblyB, ¿dónde debería buscar. NET para encontrar AssemblyB? En la Caché de Ensamblado Global, el mismo directorio que encontró AssemblyA, o en algún otro lugar enteramente? Además, si encuentra múltiples copias de ese conjunto, ¿cómo debe elegir cuál usar?

LoadFrom tiene un conjunto de reglas, mientras que LoadFile tiene otro conjunto de reglas. Es difícil imaginar muchas razones para usar LoadFile, pero si necesitabas usar reflexión en diferentes copias del mismo ensamblaje, está ahí para ti.

 85
Author: Jeff Sternal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-06 17:22:17

Desde El blog de Suzanne Cook :

LoadFile vs LoadFrom

Tenga cuidado-estos no son los mismos cosa.

LoadFrom () pasa por la fusión y puede ser redirigido a otro montaje en un camino diferente pero con esa misma identidad si uno ya está cargado en el contexto LoadFrom.

LoadFile () no se enlaza a través de la fusión en absoluto - el cargador simplemente va por delante y carga exactamente * lo que el llamada solicitada. No utilizar ya sea la carga o la carga de contexto.

Entonces, LoadFrom () usualmente te da lo que lo pediste, pero no necesariamente. LoadFile () es para aquellos que realmente, realmente quiero exactamente lo que se solicita. (*Sin embargo, a partir de la v2, la política se aplicará tanto a LoadFrom () como a LoadFile (), por lo que LoadFile () no necesariamente ser exactamente lo que era solicitar. También, a partir de v2, si un asamblea con su identidad está en el GAC, se utilizará la copia del GAC en su lugar. Utilizar Reflection Only load from() para cargar exactamente lo que quieres - pero, tenga en cuenta que los ensamblajes se cargaron de esa manera no puede ser ejecutado.)

LoadFile() tiene un catch. Desde que no utiliza un contexto vinculante, su las dependencias no son automáticamente se encuentra en su directorio. Si no disponible en el contexto de carga, usted tendría que suscribirse a la Evento AssemblyResolve para enlazar por ellos.

Ver aquí.

Véase también Elegir un Enlace Context artículo en el mismo blog.

 55
Author: CraigTP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-25 15:13:34

Después de muchos rasguños en 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. Así que cuando la primera llamada se hizo desde dentro de la DLL a uno de los otros archivos DLL que lanzó un FileNotFoundException.

LoadFrom (): Cargó la DLL que yo especificado y también todas las dependencias que vivían en ese directorio.

 36
Author: LordWilmore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-26 15:32:28

Una diferencia que noté es:

Asamblea.LoadFile - Carga el ensamblaje en diferentes AppDomain con derechos de usuario limitados (diffrence principel). no se pudieron realizar operaciones como la serilización/deserilización.

Asamblea.LoadFrom - Carga el ensamblado en el mismo dominio de aplicación con los mismos derechos de usuario (mismo principel).

 4
Author: Lalit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-15 07:19:20

Nota: Si se carga un ensamblado usando una ruta 8.3, y luego desde una ruta no-8.3, se verán como diferentes ensamblados, aunque sean la misma DLL física.

 2
Author: Gregg DeMasters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-15 02:45:57

. 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.

 1
Author: Arthur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-25 15:17:31

En mi caso, simplemente tuve que eliminar 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í.

 0
Author: David Roth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-08 23:12:35

Según la documentación:

LoadFile(String): Carga el contenido de un archivo ensamblador dado una ruta de acceso al archivo.

LoadFrom(String): Carga un ensamblado dado su nombre de archivo o ruta.

 -1
Author: cedenoaugusto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-22 20:28:52