许明会的计算机技术主页

Language:C,C++,.NET Framework(C#)
Thinking:Design Pattern,Algorithm,WPF,Windows Internals
Database:SQLServer,Oracle,MySQL,PostSQL
IT:MCITP,Exchange,Lync,Virtualization,CCNP

导航

Reflector,反射机制,可以实现对.net程序集的反编译

/*---==------------------------------------------------------===--
1、通过Assembly.LoadFrom方法可以加载某程序集
    Assembly b = Assembly.LoadFrom("sayhello.exe");
2、程序集对象的GetTypes方法可以获得Type对象的集合
    Type[] mytypes = b.GetTypes();
3、每个Type会有很多Method,通过Type对象(如实例type)的GetMethods可以获得
    MethodInfo[] mif = type.GetMethods();
4、Activator类的静态方法CreateInstance可以构建类型的实例
    Object bojName = Activator.CreateInstance(ht, s);
5、MethodInfo方法对象可以通过Invoke将对象作为参数实现方法的呼叫
Invoke还可以返回调用结果。
 * ---==------------------------------------------------------===--
*/

using System;
using System.Text;
using System.Reflection;
using System.IO;
namespace TestAssemblyConsoleApp
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            
//读取当前路径下的sayHello.exe文件,并列出其所有的类
            System.Console.WriteLine("Assembly.LoadFrom(\"sayhello.exe\");,并列出其所有的类");
            Assembly b 
= Assembly.LoadFrom("sayhello.exe");
            Type[] mytypes 
= b.GetTypes();//程序集的GetTypes方法返回所有Type对象的集合
            foreach (Type t in mytypes)
            
{
                System.Console.WriteLine(t.FullName);
            }


            
//分析当前EXE自身的所有方法
            System.Console.WriteLine("分析当前EXE自身的所有方法,任意键继续");
            System.Console.ReadLine();
            Type ht 
= typeof(HelloWorld);
            MethodInfo[] mif 
= ht.GetMethods();//类型Type的GetMethods方法返回所有方法的集合
            foreach (MethodInfo mf in mif)
            
{
                System.Console.WriteLine(mf.Name);
            }

            
//将类实例化,并调用其内部的方法
            System.Console.WriteLine("将类实例化,并调用其内部的方法,任意键继续.");
            System.Console.ReadLine();
            Object obj 
= Activator.CreateInstance(ht);//调用无参构造函数创建实例
            string[] s = "veky" };
            Object bojName 
= Activator.CreateInstance(ht, s);//带参构造函数创建实例
//            BindingFlags flags = (BindingFlags.NonPublic| BindingFlags.Public | BindingFlags.Static |
//                BindingFlags.Instance | BindingFlags.DeclaredOnly);
            MethodInfo msayhello = ht.GetMethod("SayHello");
            msayhello.Invoke(obj, 
null);//SayHello,通过无参数的实例      
            msayhello.Invoke(bojName, null);//SayHello调用带参构造函数
            msayhello = ht.GetMethod("getString");
            
string str = msayhello.Invoke(obj, nullas string;//有返回值
            System.Console.WriteLine(str);
        }

    }


    
"类HelloWorld定义"
}

posted on 2007-11-30 16:05  许明会  阅读(255)  评论(0)    收藏  举报