elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Como cargar un assembly usando la reflexión en C#
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como cargar un assembly usando la reflexión en C#  (Leído 2,501 veces)
Borito30


Desconectado Desconectado

Mensajes: 481


Ver Perfil
Como cargar un assembly usando la reflexión en C#
« en: 20 Mayo 2017, 20:55 pm »

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
  1. //Load the bytes as an assembly
  2. Assembly exeAssembly = Assembly.Load(decryptedBuffer);
  3.  
  4. //Execute the assembly
  5. object[] parameters = new object[1];                
  6. exeAssembly.EntryPoint.Invoke(null, parameters);
Pero ahora estaba intentandolo usando la reflexión para ello hice lo siguiente:

Código
  1. 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:
Código:
   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?


En línea

Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Como cargar un assembly usando la reflexión en C#
« Respuesta #1 en: 21 Mayo 2017, 00:12 am »

Problem 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
  1. Assembly ass = default(Assembly);
  2. Type t = typeof(Assembly);
  3. BindingFlags searchFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly;
  4. MethodInfo mi = t.GetMethod("Load", searchFlags, Type.DefaultBinder, new Type[] { typeof(byte[]) }, null);
  5.  
  6. if (mi == null) {
  7.    Debug.WriteLine("Member not found. Bad search flags?.");
  8.  
  9. } else {
  10.    byte[] byteData = File.ReadAllBytes(@".\MyAssembly.dll");
  11.    object[] @params = new object[] { byteData };
  12.    ass = (Assembly)mi.Invoke(t, @params);
  13.    Debug.WriteLine(ass.FullName);
  14.  
  15. }

¡Saludos!


« Última modificación: 21 Mayo 2017, 02:49 am por Eleкtro » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Reflexión en javascript?
Scripting
lnvisible 0 1,920 Último mensaje 30 Septiembre 2011, 21:14 pm
por lnvisible
Reflexión
Foro Libre
jemez44 5 2,758 Último mensaje 6 Octubre 2013, 14:09 pm
por jemez44
Samsung lanza cable para cargar dispositivos usando tu teléfono
Noticias
wolfbcn 0 971 Último mensaje 23 Septiembre 2014, 21:16 pm
por wolfbcn
Evitar el reconectar al cargar la pagina usando fancywebsocket.js .
Desarrollo Web
70N1 9 6,013 Último mensaje 12 Diciembre 2014, 00:28 am
por engel lex
C++. Cargar una matriz de struct usando archivos de cabeceras
Programación C/C++
LeoXsiempre 2 2,994 Último mensaje 10 Abril 2015, 00:34 am
por LeoXsiempre
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines