4

C#/ .NET 4.0では、リフレクションを使用してフィールド値を取得しようとしています。

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

私は状況に少し戸惑っています。返される値はですがnull、フィールド(デバッガーで観察した場合)はnullではありません。さらに不可解なことに、上記のコードは他のオブジェクトプロパティでも機能します。

唯一の奇妙な側面は2つのフラグIsSecurityCriticalであり、それはですIsSecuritySafeCriticaltrue、それが実際に状況に関連しているかどうかさえわかりません。

私は小さな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.
    }
}

そのような振る舞いを説明する提案はありますか?

4

1 に答える 1

5

これは、asp.netアプリケーションを実行しているため、.net 4.0のセキュリティモデルが原因で発生します。asp.netアプリケーションは、完全に信頼されて実行されていない可能性があります。このフィールドはセキュリティ上重要であるため、リフレクションを介してアクセスすることはできません。

あなたはmsdnで少し読むことができます:リフレクションのためのセキュリティの考慮事項

于 2010-12-14T18:07:00.130 に答える