日期:2014-05-18  浏览次数:20821 次

如何使得某个类无法被反射技术而访问到私有成员
class Set
  {
  private int _test = 10;
  public Set()
  {
  }
  public int Test
  {
  get
  {
  return _test;
  }
  }
  }
  class App
  {
  static void Main()
  {
  Set myTest = new Set();
  Console.WriteLine("{0}",myTest.Test);
  Type t = typeof(Set);
  try
  {

  t.InvokeMember("_test", BindingFlags.SetField | BindingFlags.Non
Public | BindingFlags.Instance, null, myTest, new object[] { 5 });
  Console.WriteLine("{0}", myTest.Test);
  }
  catch (Exception e)
  {

  Console.WriteLine(e.Message);
  }
  Console.Read();

  }

  }
执行之后set类的私有变量被改成5了。

请问设计set类时如何阻止反射的这一操作呢?


------解决方案--------------------
看看你要的是不是这个
http://msdn2.microsoft.com/zh-cn/library/hk3b9142.aspx

------解决方案--------------------
如果你用 .Net 1.x 的话:

System.Security.Permissions.StrongNameIdentityPermission 可以从根本上防止调用, 即使反射调用也会检查..

(可惜 2.x 草率取消 StrongNameIdentityPermission 强大功能)

1. 利用 SN.EXE 生成一个 StrongName key 文件

2. 把自己的 Application 引用上述 key file Strong Name

3. 相应位置使用:[StrongNameIdentityPermission(SecurityAction.Demand, PublicKey="public key from your key file")]

如果是 2.x 用以尝试 ReflectPemissionFlag 或者 InternalVisibleToAttribute ...