Como cargar un assembly usando la reflexión en C#

Iniciado por Borito30, 20 Mayo 2017, 20:55 PM

0 Miembros y 2 Visitantes están viendo este tema.

Borito30

Hola mi pregunta es como puedo cargar un assembly ya sea una dll o binario usando la reflexión, normalmente para cargar un assembly lo hago de la siguiente manera:

Código (csharp) [Seleccionar]
//Load the bytes as an assembly
Assembly exeAssembly = Assembly.Load(decryptedBuffer);

//Execute the assembly
object[] parameters = new object[1];                
exeAssembly.EntryPoint.Invoke(null, parameters);

Pero ahora estaba intentandolo usando la reflexión para ello hice lo siguiente:

Código (csharp) [Seleccionar]
typeof(Assembly).GetMethod("Load").Invoke(null,new object[] {decryptedBuffer});
Cuando lo hago del primer modo funciona bien. Pero cuando uso el siguiente método(usando solo reflexión) me devuelve el siguiente error:

   typeof(Assembly).GetMethod("Load").Invoke(null,new object[] {decryptedBuffer});
Problem signature:
 Problem Event Name:   CLR20r3
 Problem Signature 01: Proof.exe
 Problem Signature 02: 1.0.0.0
 Problem Signature 03: 591f941f
 Problem Signature 04: mscorlib
 Problem Signature 05: 4.6.1590.0
 Problem Signature 06: 5787ed44
 Problem Signature 07: 1037
 Problem Signature 08: 60
 Problem Signature 09: System.Reflection.AmbiguousMatch
 OS Version:   6.1.7601.2.1.0.256.1
 Locale ID:    3082
 Additional Information 1: 0a9e
 Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
 Additional Information 3: 0a9e
 Additional Information 4: 0a9e372d3b4ad19135b953a78882e789

Read our privacy statement online:
 http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409

If the online privacy statement is not available, please read our privacy statement offline:
 C:\Windows\system32\en-US\erofflps.txt

A que se debe este error? Pregunto porque he visto varios artículos relacionados con esto y quería entender porque en este caso porque no ha funcionado.

Estaba intentando llamar al assembly load usando la reflexión pero no entiendo porque una versión si funciona y la otra no como podría compatibizarla para que funcionase / cargando el assembly load de modo reflectivo?
Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)

Eleкtro

#1
Cita de: Ragaza en 20 Mayo 2017, 20:55 PMProblem Signature 09: System.Reflection.AmbiguousMatch

Ahí te esta aclarando el motivo del error:

Basicamente lo que ha ocurrido en tu código es que la búsqueda de "X" miembro mediante Reflection ha resultado en una coincidencia ambigua, ¿y esto que quiere decir?, pues que se ha encontrado más de 1 miembro con el mismo nombre pero con distinta parametización, esto es una ambiguedad, es decir, las sobrecargas:

System.Assembly - Class Methods | MSDN
Cita de: MSDN Reference

No puedes esperar que Reflection sepa qué overload/sobrecarga es el que debe devolver, si tú no le ayudas a descartar los demás miembros para quedarse con solamente uno. Para ello debes limitar la búsqueda de miembros usando el overload de la función Type.GetMethod() que acepta como argumento la enumeración BindingFlags en la que especificaremos el tipo de miembro y su nivel de acceso, junto a un Array con el tipo de parametización del miembro en cuestión:

Código (csharp) [Seleccionar]

Assembly ass = default(Assembly);
Type t = typeof(Assembly);
BindingFlags searchFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly;
MethodInfo mi = t.GetMethod("Load", searchFlags, Type.DefaultBinder, new Type[] { typeof(byte[]) }, null);

if (mi == null) {
   Debug.WriteLine("Member not found. Bad search flags?.");

} else {
   byte[] byteData = File.ReadAllBytes(@".\MyAssembly.dll");
   object[] @params = new object[] { byteData };
   ass = (Assembly)mi.Invoke(t, @params);
   Debug.WriteLine(ass.FullName);

}


¡Saludos!