2011-05-12 18 views
6

He encontrado un problema donde el método de reflexión GetMethod no devuelve un método estático para una clase. Esto solo está saliendo mal en un iPhone real; en el simulador está funcionando correctamente. He intentado lo siguiente:Método de reflexión GetMethod no devuelve el método estático de una clase en un iphone, pero sí en el simulador

MethodInfo methInfo = _type.GetMethod (methodName); 

y

MethodInfo methInfo = _type.GetMethod (methodName, System.Reflection.BindingFlags.Static); 

pero ninguno de éstos devuelven el método especificado en methodName. El método especificado existe como lo muestra el hecho de que funciona en el simulador. Confirmé con el depurador que mi variable de miembro _type contiene la referencia de tipo de clase correcta. Los métodos que estoy tratando de recuperar se declaran como públicos en la clase.

¿Alguien ha encontrado esto antes o sabe por qué esto funcionaría en el simulador pero no en el iPhone real?

+0

El simulador y el teléfono real son muy diferentes. Diferencias como esta surgen. Los foros de MonoTouch es probablemente un mejor lugar para preguntar. –

+0

Tenía la impresión de que los foros de MonoTouch se habían mudado aquí; al menos había un mensaje a tal efecto en los foros de MonoTouch a principios de año. – BruceHill

+0

El equipo de MT supervisa SO, y generalmente responde a la mayoría de las preguntas sobre MT. – Jason

Respuesta

7

La reflexión, aunque no funciona completamente en iOS, funciona. El problema es que el enlazador está activado en la configuración del dispositivo y está cortando el método, ya que no se está utilizando. El vinculador no puede "ver" llamadas de reflexión.

Si se trata de un objeto personalizado, decorar con el PreserveAttribute:

[Preserve(AllMembers=true)] 
public class MyClass 
{} 

Si se trata de un objeto desde el SDK, tiene dos opciones:

  1. desactivar por completo el enlazador. Esto no es bueno ya que el tamaño final será grande.
  2. Use el método una vez en el código directamente para que el vinculador sepa que está allí y no lo desvistirá.
+0

Gracias, Dimitris. Usted es perfecto con esta respuesta. El enlazador realmente estaba eliminando los métodos. Agregué el atributo _Preserve_ que mencionaste y mi aplicación ahora se ejecuta correctamente en el iphone. ¡Gracias! :) – BruceHill

+0

System.Reflection funciona igual de bien en iOS que en cualquier otra arquitectura/SO compatible con Mono. Lo que no es compatible es System.Reflection.Emit, que es una bestia completamente diferente. Buenos consejos de lo contrario :) –

+0

Hay algunos problemas con System.Reflection en iOS. No todos los aspectos funcionan, la mayoría lo hace. –

Cuestiones relacionadas