Pregunta

Me preguntaba qué sucede si tuviera que cargar los mismos bytes de ensamblaje dos veces dentro de una aplicación web.

Por ejemplo, tengo este código

byte[] assem = System.IO.File.ReadAllBytes(appRoot + "/Plugins/Plugin.dll");

var loadedAssem = Assembly.Load(assem);

var plugin = loadedAssem.CreateInstance("Plugin.ThePlugin") as IPlugin;

Ejecuté este código y en la primera solicitud supongo que cargaría el ensamblaje en RAM (¿o el AppDomain de tiempo de ejecución HTTP?) Y luego puedo crear instancias de lo que haya allí.

Si volviera a ejecutar este código, digamos en la segunda solicitud, ¿qué pasaría con la Asamblea en la primera solicitud?

¿Todavía existiría en Ram? Si es así, ¿cómo se diferencia entre los dos conjuntos? ¿O sobrescribe las clases de declaración previamente?

Esto es para que tengo entendido, como lo hago en PHP, no es solo un caso de "requirir_once".

¿Fue útil?

Solución

Esto cargará dos copias distintas del ensamblaje, cada una de las cuales se puede usar desde su aplicación. Los tipos en cada ensamblaje son tipos distintos y no interoperarán con una otra. Por ejemplo, si toma un widget de Copy1 e intenta pasarlo a un método que tome un widget en Copy2, esto causará una falla en tiempo de ejecución. No es posible descargar ensamblajes una vez que se hayan cargado de esta manera (es decir, en su appdominio principal).


Con respecto a la instancia:

  • Si usa Assembly.CreateInstance (como se muestra en su publicación), esto lo creará a partir de la instancia de ensamblaje que usó para hacer la llamada.
  • Si usa un activador.createInstance que toma una cadena, debe especificar el nombre del ensamblaje. Dado que ambos ensamblajes cargados tendrán el mismo nombre en este caso, utilizará reglas de resolución de ensamblaje, que, creo que por defecto, favorecerán la primera coincidencia (por lo que el ensamblaje que cargó primero). No estoy seguro de esto. Puedes enganchar el Appdomain.assemblyresolve Evento para proporcionar su propia priorización y hacer que use su ensamblaje más recientemente cargado.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top