1.获取、设置类成员值

      //反射获取私有成员
      FieldInfo.FieldType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
      //反射获取私有静太成员
      FieldInfo.FieldType.GetFields(BindingFlags.NonPublic | BindingFlags.Static)

      //静态成员设值
      FieldInfo.SetValue(null, value);
      //静态成员取值 
      FieldInfo.GetValue(null);
  

 

2.获取程序集中的常量值

    public void init()
    {
      char[] chars = { 'w', 'o', 'r', 'd' };
    }

 如何获取函数中常量值{ 'w', 'o', 'r', 'd' }?

先看IL代码:

.method public hidebysig instance void  'init'() cil managed
{
  // 代码大小       20 (0x14)
  .maxstack  3
  .locals init ([0] char[] chars)
  IL_0000:  nop
  IL_0001:  ldc.i4.4
  IL_0002:  newarr     [mscorlib]System.Char
  IL_0007:  dup
  IL_0008:  ldtoken    field int64 '<PrivateImplementationDetails>'::'$$method0x6000001-90F41662952421298541612D1187C6E2E4D8E2A1'
  IL_000d:  call       void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(class [mscorlib]System.Array,
                                                                                                      valuetype [mscorlib]System.RuntimeFieldHandle)
  IL_0012:  stloc.0
  IL_0013:  ret
} // end of method Program::'init'

 其中'<PrivateImplementationDetails>'::'$$method0x6000001-90F41662952421298541612D1187C6E2E4D8E2A1'为:

 

也说LI代码中会生成名为<PrivateImplementationDetails>的类

“常量值”会被命名为类似 $$method0x6000001-90F41662952421298541612D1187C6E2E4D8E2A1 的成员变量
包含在<PrivateImplementationDetails>的类中
初始化常量的时候IL会调用InitializeArray函数进行和相应的字段地址对变量进行初始化。

可通过始下方法取得常量值

      Type[] _exeTypeAry = 对应程序集的Assembly.ManifestModule.GetTypes();
      Type _first = Array.Find(_exeTypeAry, t => { return t.Name == "<PrivateImplementationDetails>"; });
      FieldInfo[] _fieldAry = _first.GetFields(BindingFlags.NonPublic | BindingFlags.Static);//获取静态私有成员
      FieldInfo _charField = Array.Find(_fieldAry, t => { return t.Name.IndexOf("IL中的常量成员名称") != -1; });

      char[] _char2 = new char[4];
      System.Runtime.CompilerServices.RuntimeHelpers.InitializeArray(_char2, _charField.FieldHandle);

 

3.一些加密过的程序集中存在一些不属于任何类的字段或函数。如何获取?

 

Assembly.ManifestModule下有方法:

GetFields();
GetMethods()

 

 posted on 2014-12-21 20:11  Grart  阅读(1146)  评论(0)    收藏  举报