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
浙公网安备 33010602011771号