反射、反射加壳、反射脱壳、反射注册机(上)
反射、反射加壳、反射脱壳、反射注册机(上)
程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。反射的用途很大,在上节文章中的“晚期绑定”就是利用了反射的性质,在插件的编写上更是需要反射。我们常用的反编译工具Refiector 也是用了反射的性质。
我们今天就来写一个简单的类似于Refiector的东西,通过反射来获得程序集的多种信息。
1、获得程序集所有的namespace
public static ArrayList GetAllNameSpace(Assembly assembly)
{
ArrayList namePaceArry = new ArrayList();
foreach(Type type in assembly.GetTypes())
{
if (!namePaceArry.Contains(type.Namespace) && type.Namespace != null)
{
namePaceArry.Add(type.Namespace);
}
}
return namePaceArry;
}
2、获得程序集的所有类
public static ArrayList GetClassNames(Assembly assembly, string nameSpace)
{
Type[] types = assembly.GetTypes();
ArrayList classArray = new ArrayList();
foreach (Type type in types)
{
if (type.FullName == nameSpace + "." + type.Name && type.BaseType.Name != "Enum")
{
classArray.Add(type.Name);
}
}
return classArray;
}
{
Type[] types = assembly.GetTypes();
ArrayList classArray = new ArrayList();
foreach (Type type in types)
{
if (type.FullName == nameSpace + "." + type.Name && type.BaseType.Name != "Enum")
{
classArray.Add(type.Name);
}
}
return classArray;
}
3、获得程序集的某一类中的所有方法
public static MethodInfo [] GetMethod(Assembly assembly, string fullName)
{
Type type = assembly.GetType(fullName);
return type.GetMethods();
}
这里的fullName是包含namespace和类名合在一起的。
4、获得程序集中的某一类中的所有属性
public static PropertyInfo[] GetPropertys(Assembly assembly, string fullName)
{
Type type = assembly.GetType(fullName);
return type.GetProperties();
}
{
Type type = assembly.GetType(fullName);
return type.GetProperties();
}
5、获得程序集的枚举类型
public static ArrayList GetEnums(Assembly assembly, string nameSpace)
{
Type[] types = assembly.GetTypes();
ArrayList classArray = new ArrayList();
foreach (Type type in types)
{
if (type.FullName == nameSpace + "." + type.Name && type.BaseType.Name == "Enum")
{
classArray.Add(type.Name);
}
}
return classArray;
}
{
Type[] types = assembly.GetTypes();
ArrayList classArray = new ArrayList();
foreach (Type type in types)
{
if (type.FullName == nameSpace + "." + type.Name && type.BaseType.Name == "Enum")
{
classArray.Add(type.Name);
}
}
return classArray;
}
6、获得程序集中枚举的内容,以及每项的值
public static FieldInfo [] GetSubEnums(Assembly assembly, string fullName)
{
return assembly.GetType(fullName).GetFields();
}
public static string GetSubEnumsData(Assembly assembly, string fullName,string name)
{
FieldInfo info = assembly.GetType(fullName).GetField(name);
return info.GetRawConstantValue().ToString();
}
{
return assembly.GetType(fullName).GetFields();
}
public static string GetSubEnumsData(Assembly assembly, string fullName,string name)
{
FieldInfo info = assembly.GetType(fullName).GetField(name);
return info.GetRawConstantValue().ToString();
}
7、获得程序集中某一类的所有属性
public static PropertyInfo[] GetPropertys(Assembly assembly, string fullName)
{
Type type = assembly.GetType(fullName);
return type.GetProperties();
}
{
Type type = assembly.GetType(fullName);
return type.GetProperties();
}
8、获得程序集中某一具体方法的IL代码
public static string GetMethodData(Assembly assembly, string fullName,string name, Type [] types)
{
Type type = assembly.GetType(fullName);
MethodInfo info = type.GetMethod(name, types);
string data = String.Empty;
if (info.GetMethodBody() != null)
{
byte[] il = info.GetMethodBody().GetILAsByteArray();
if (il != null)
{
int inslength;
for (int currentpos = 0;currentpos < il.Length;currentpos += inslength)
{
inslength = 0;
data += String.Format("{0:X8}: {1}", currentpos,Disassembler.Decode(il, currentpos, out inslength)) + "\r\n";
}
}
return data;
}
return "此函数不做反编译处理";
}
注意这里面的type是为了寻找重载方法而制定的参数,il = info.GetMethodBody().GetILAsByteArray()其实返回的是IL代码的二进制表达形式,而我们还需要把它转化为真正的IL代码,我写在类Disassembler.Decode(......)之中了,由于代码比较长大家可以下载附件源代码查看。{
Type type = assembly.GetType(fullName);
MethodInfo info = type.GetMethod(name, types);
string data = String.Empty;
if (info.GetMethodBody() != null)
{
byte[] il = info.GetMethodBody().GetILAsByteArray();
if (il != null)
{
int inslength;
for (int currentpos = 0;currentpos < il.Length;currentpos += inslength)
{
inslength = 0;
data += String.Format("{0:X8}: {1}", currentpos,Disassembler.Decode(il, currentpos, out inslength)) + "\r\n";
}
}
return data;
}
return "此函数不做反编译处理";
}
附件下载: https://files.cnblogs.com/chengchen/CiCiReflection.rar