FieldInfo.GetValue nulo cambio de un miembro privado, mientras depurador indica que el campo no es nulo?

StackOverflow https://stackoverflow.com/questions/4441561

  •  10-10-2019
  •  | 
  •  

Pregunta

En C # / .NET 4.0 que estoy tratando de recuperar un valor de campo a través de la reflexión con:

var bar = foo.GetType()
  .GetField("_myField", BindingFlags.Instance | BindingFlags.NonPublic)
  .GetValue(foo)

Estoy un poco desconcertado por la situación. El valor devuelto es null, y, sin embargo, el campo (cuando se observa a través del depurador) no es nulo. Aún más desconcertante, el código aquí arriba funciona para las otras propiedades del objeto.

El único aspecto extraño son las dos banderas IsSecurityCritical y IsSecuritySafeCritical que son true, pero no estoy siquiera seguro de que es realmente relevante para la situación.

Estoy terminando en una situación de este tipo con un pequeño HttpModule.

public class MyModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += BeginRequest;
    }

    void BeginRequest(object sender, EventArgs e)
    {
         var app = (HttpApplication)sender;

         var rawContent = typeof(HttpRequest)
                .GetField("_rawContent", BindingFlags.Instance | BindingFlags.NonPublic)
                .GetValue(app.Request);

         // at this point 'rawContent' is null, while debugger indicates it is not.
    }
}

Cualquier sugerencia de que podría explicar tal comportamiento?

¿Fue útil?

Solución

Esto es causado por el modelo de seguridad de .NET 4.0, que se está ejecutando una aplicación asp.net, que probablemente no se está ejecutando en plena confianza. A medida que el campo es crítico de seguridad, no se puede acceder a él a través de la reflexión.

Se puede leer un poco en el MSDN sobre: ??Consideraciones de seguridad para Reflexión

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top