asp.net cargando dinĂ¡micamente ensamblajes
plugins webforms (1)
Estoy intentando crear algún tipo de sistema de complementos para formularios web asp.net utilizando MEF.
Hasta ahora he venido con una solución donde el sitio web del host buscará en su carpeta de complementos para cargar otros sitios web llamados Módulo . Un módulo (complemento) es simplemente otro proyecto de sitio web, por lo que tiene sus propios ensamblajes en su subcarpeta bin .
Como seguramente ya sabe, una aplicación ASP.NET no cargará dll fuera de su carpeta bin . Entonces, si intento acceder a una página de módulo (por ejemplo: plugins / MyModule / Page.aspx ). Recibiré un error que dice que el servidor no puede cargar el ensamblaje MyModule . Puedo lanzar el ensamblaje del módulo en la carpeta principal y todo funcionará, pero me gustaría mantener todos los archivos del módulo en la misma carpeta.
Así que estoy buscando una manera de cargar ensamblajes fuera de la carpeta bin . Intenté jugar con el archivo web.config pero no pude encontrar una solución funcional.
Luego entré en la clase BuildManager y escribí este código:
string pluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugins");
foreach (string f in Directory.GetDirectories(pluginPath))
{
string binPath = Path.Combine(f, "bin");
if (Directory.Exists(binPath))
{
foreach (String file in Directory.GetFiles(binPath, "*.dll"))
{
Assembly a = Assembly.LoadFrom(file);
BuildManager.AddReferencedAssembly(a);
}
}
}
Busca en la carpeta del complemento cualquier otra subcarpeta que contenga una carpeta bin y carga los ensamblajes correspondientes usando BuildManager . Para hacer que este código funcione, tengo que llamarlo en PreApplicationStartMethod del ensamblado global.aspx .
Ahora cuando navego a la página del complemento ( plugin / MyModule / Page.aspx ) no me dará el error anterior, pero la página está en blanco. Revisé la fuente y no hay html, nada. Intenté depurar la página pero nunca se llama al método Page_Load . Así que supongo que de alguna manera el código detrás de Page.aspx nunca se llama.
Alguna idea ?
Gracias.
Editar:
Entonces, después de buscar un poco más, encontré una solución allí:
Herencia de la página de resolución BuildManager
Cuando cargo un ensamblaje de módulo, almaceno su referencia en un dictionnay. Luego, en el controlador de eventos de AppDomain.CurrentDomain.AssemblyResolve , devuelvo el ensamblaje del módulo correspondiente.
Tengo el mismo problema. Lo arreglé resolviendo el ensamblaje como se muestra a continuación
protected virtual void Application_Start(object sender, EventArgs e)
{
//...
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var currentAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (var assembly in currentAssemblies)
{
if (assembly.FullName == args.Name || assembly.GetName().Name == args.Name)
{
return assembly;
}
}
return null;
}