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:
//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:
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?
Cita de: Ragaza en 20 Mayo 2017, 20:55 PMProblem Signature 09: System.Reflection.AmbiguousMatch
Ahí te esta aclarando el motivo del error:
- System.Reflection.AmbiguousMatchException Class | MSDN (https://msdn.microsoft.com/en-us/library/system.reflection.ambiguousmatchexception(v=vs.110).aspx)
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 (https://msdn.microsoft.com/en-us/library/system.reflection.assembly(v=vs.110).aspx#Methods)
Cita de: MSDN Reference(http://i.imgur.com/JXAPIc8.png)
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:
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!