2009-02-20 17 views
6

Estoy tratando de cargar algunos módulos mediante el enganche en los eventos AppDomain.AssemblyResolve y AppDomain.ReflectionOnlyAssemblyResolve. Mientras conseguí que el primero trabajara, fracasé miserablemente en este último. He hervido mi problema a este pequeño programa:¿Por qué ReflectionOnlyAssemblyResolve no se ejecuta al intentar Assembly.ReflectionOnlyLoad?

public static class AssemblyLoader 
{ 
    static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += 
      ReflectionOnlyAssemblyResolve; 

     // fails with FileNotFoundException 
     Assembly.ReflectionOnlyLoad("Foo"); 
    } 

    public static Assembly ReflectionOnlyAssemblyResolve(object sender, 
     ResolveEventArgs args) 
    { 
     Trace.TraceInformation(
      "Failed resolving Assembly {0} for reflection", args.Name); 

     return null; 
    } 
} 

La ejecución de este programa falla con un FileNotFoundException cuando se trata de Assembly.ReflectionOnlyLoad, pero no llama al manejador ReflectionOnlyAssemblyResolve. Estoy bastante perplejo allí.

¿Alguien tiene una idea de cuál podría ser la causa raíz de esto y cómo hacer que esto funcione?

Gracias!

Respuesta

8

Parecería que el evento ReflectionOnlyAssemblyResolve sólo se utiliza para resolver las dependencias, no en la asamblea de nivel superior, como se indica aquí:

http://codeidol.com/csharp/net-framework/Assemblies,-Loading,-and-Deployment/Assembly-Loading/

Y aquí:

http://blogs.msdn.com/junfeng/archive/2004/08/24/219691.aspx

+0

¿Hay alguna manera de interceptar un intento fallido en el montaje de reflexión-solamente-cargando? – derabbink

+0

@derabbink Esa es una pregunta aparte, me imagino. – casperOne

0

Expansión en la respuesta de CasperOne.

Si desea interceptar eventos de resolución de ensamblaje directos, debe conectarlos al evento AppDomain.AssemblyResolve. Sin embargo, este es un gancho global, por lo que solo no se ajustará a su escenario. Sin embargo, si su aplicación es de un solo hilo, podría conectarse a corto plazo para interceptar eventos de resolución específicos.

static void LoadWithIntercept(string assemblyName) { 
    var domain = AppDomain.CurrentDomain; 
    domain.AssemblyResolve += MyInterceptMethod; 
    try { 
    Assembly.ReflectionOnlyLoad(assemblyName); 
    } finally { 
    domain.AssemblyResolve -= MyInterceptMethod; 
    } 
} 

private static Assembly MyInterceptMethod(object sender, ResolveEventArgs e) { 
// do custom code here 
} 
+0

AssemblyResolve no se desencadena al usar ReflectionOnlyLoad(). Como llegué a entender, esto es por diseño, para evitar cargar ensamblajes que no son "deseados" por el usuario de ReflectionOnlyLoad(). Todavía no estoy seguro si estoy completamente de acuerdo con ese punto de vista. –

Cuestiones relacionadas