如何使用Reflection避免访问类的私有成员?

时间:2014-05-26 19:46:45

标签: c# security reflection

我正在阅读Security Considerations for Reflection,我看到以下一行:

  

即使代码完全受信任,透明代码也无法使用反射来访问安全关键成员。抛出MethodAccessException,FieldAccessException或TypeAccessException。

所以,我写了一个测试程序:

班级图书馆:

namespace ClassLibrary
{
    public class Foo
    {
        [SecurityCritical] private int X;
    }
}

测试程序:

using ClassLibrary;
namespace ReflectionSecurityTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Foo f = new Foo();
            var flags = BindingFlags.Instance | BindingFlags.NonPublic;
            var field = f.GetType().GetField("X", flags);
            field.SetValue(f,15);
            Console.WriteLine(field.GetValue(f));
        }
    }
}

我希望看到一个例外,但我会在控制台中看到15。问题是为什么?我误解了SecurityCritical做了什么或者我做错了什么?

1 个答案:

答案 0 :(得分:4)

下面的要点指出:

  
      
  • 使用部分信任运行的代码视为透明。
  •   
     

从命令行运行的应用程序代码以完全信任的方式运行。只要它没有标记为透明,它就可以使用反射来访问安全关键成员。当使用部分信任运行相同的代码时(例如,在沙盒应用程序域中),程序集的信任级别确定它是否可以访问安全关键代码:如果程序集具有强名称并安装在全局程序集缓存中,则是一个值得信赖的程序集,可以调用安全关键成员。如果它不受信任,即使它没有标记为透明,它也会变得透明,并且它无法访问安全关键成员。

所以回答你标题中的问题:

  

如何使用Reflection避免访问类的私有成员?

如果您无法对执行反射的代码进行沙盒处理,则不能。