2009-08-27 29 views
17

Estoy trabajando en un diálogo simple de buscador de clases que permite a los usuarios abrir un ensamblaje y elegir un método estático desde adentro. Sin embargo, hay algunas situaciones en las que faltan las dependencias de la asamblea.Ignorar las dependencias perdidas durante ReflectionOnlyLoad

Como solo necesito el nombre del método y no su prototipo completo, ¿hay alguna forma de superar la excepción FileNotFoundException que se produce al llamar al Assembly.ReflectionOnlyLoadFrom? Actualmente estoy manejando AppDomain.ReflectionOnlyAssemblyResolve pero si vuelvo nula cuando me siento un FileLoadException con el siguiente mensaje:

no puede resolver la dependencia de reunión '...' porque no se ha precargado. Al utilizar las API ReflectionOnly, los ensamblados dependientes deben cargarse o cargarse previamente a petición a través del evento ReflectionOnlyAssemblyResolve.

Sé que esto debe ser posible de alguna manera porque .NET Reflector le permite omitir las dependencias no resueltas. Sin embargo, estoy empezando a pensar que quizás Reflector analiza los ensamblajes de forma manual en lugar de cargarlos en el CLR y usar la reflexión estándar. Tal vez utiliza algo como Cecil del proyecto Mono.

+0

dudo reflector utiliza Cecil - que es anterior y que provenía del interior de la EM. También dudo que use CCI. Me parece que Lutz es solo un Dios que no podría rodar todas esas cosas en el sueño (¡aunque al final se cansó!) –

Respuesta

3

Probaría Cecil si va a hacer un trabajo no trivial con ensamblajes. También está el MS CCI. (No estoy 100% seguro de que ninguno de estos trabajos falten bits, pero ciertamente son buenas herramientas en este espacio y me sorprendería que no lo hicieran)

Si realmente necesitas llegar al metal, no puede vencer a este Asmex tutorial and sample, que definitivamente debería funcionar o dejarlo trabajar alrededor de él.

+0

Ese tutorial de Asmex parece muy interesante, tendré que intentarlo. –

1

Creo que Reflector hace su propio análisis/carga de ensamblaje: miré su fuente hace un tiempo (utilizando Reflector mismo: p) y vi un gran número de clases relacionadas con el ensamblaje, que parecen ser analizadas en un estructura de árbol masiva.

Siempre puede enviar un correo electrónico a Red Gate/Rutz Loeder y solicitar confirmación definitiva. :)

3

Esto ignorar sus dependencias faltantes:

 static void Main(string[] args) 
     { 
      AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve); 
      Assembly assembly = Assembly.ReflectionOnlyLoad("foo"); 
      foreach (Type t in assembly.GetTypes()) 
      { 
       Console.WriteLine(t.FullName); 
      } 
     } 

     static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args) 
     { 
      return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name); 
     } 
+2

Esto no funcionó para mí. Todavía busca las dependencias faltantes. – Jonn

Cuestiones relacionadas