今天看到木帷幕一篇文章,讲到如何用反射调用别人的.net程序。遂自己也根据他的理念实作了一遍。=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
    我要调用的应用程序代码如下:=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
namespace MyClass=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
{=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
   
///=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
<summary>=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
   
/// Class2 的摘要说明。=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
   
///=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
</summary>=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
public class UseClass=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
{=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
       
protected int _account;=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
       
public UseClass()=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
        {=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
            _account
=0;=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
        }=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
       
public UseClass(int account)=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
        {=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
            _account
=account;=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
        }=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
       
public void AddAccount(int account)=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
        {=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
            _account
+=account;=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
            Console.WriteLine(_account);=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
            =»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
        }=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
       
public void MulAccount(int account)=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
        {=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
            _account
-=account;=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
        }=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
       
public int ReturnAccount()=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
        {=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
           
return _account;=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
        }
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
    }=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
}
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
    一,首先我们要获得这个应用程序的Assmebly对象。然后才在这个对象上进行操作。=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
Assembly assemFile    =    Assembly.LoadFile(@"F:\Source\shipfi\MyTestCode\CSConsole\反射\被调用的类\MyClass\bin\Debug\myclass.exe");=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
    二,取得这个应用程序所需要的类的类型,这个Type是代表整个Class的。在这里是MyClass.UseClass类的类型。=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
    Type myAppType    =    assemFile.GetType("MyClass.UseClass"); //获取UseClass类的类型=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
    三,获得类的构造函数信息,并且构造它。且构造函数的Type保存至一Type变量中,以后调用该类的方法时,需要用到该构造函数信息。这里我们用无参数的构造函数来构造:=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
ConstructorInfo cInfo    =    myAppType.GetConstructor(new Type[]{}); //获得UseClass的构造函数,并且,使用第一个不带参数的构造函数=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
object app    =    cInfo.Invoke(new object[]{}); //调用构造函数生成对象。
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
    如果要使用带参数的构造函数,可以像下面这样:=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
Type inttype    = typeof(int);=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
ConstructorInfo cInfo2   
=    myAppType.GetConstructor(new Type[]{inttype});=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
object app2    =    cInfo2.Invoke(new object[]{4}); //_account的默认值为4
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
    这里,new Type[]{}大括号里面的参数得是Type类型,否则,如果写入int的话,编译器会出现错误。=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
    完成之后,app或app2就是代表了构造函数的信息。而myAppType则代表的是类的信息。下面就是调用类中的方法了。=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
//调用AddAccount(3)方法,设置_account为3=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
object str    =    myAppType.GetMethod("AddAccount").Invoke(app,new object[]{3});
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
    这里str保存的是函数返回值的信息,由于AddAccount返回值为Void.如果设置断点查看str的值的话,编译器会告诉你str是末定义的值。=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
    再来看另一个调用的方法:=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
object str2    =    myAppType.GetMethod("ReturnAccount").Invoke(app2,new object[]{});=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
Console.WriteLine((
int)str2); //这个ReturnAccount用得是带参数的构造函数,所以,这里输出为4=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
    由于ReturnAccount()是有返回类型,所以,str2可以转化为int类型输出。=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
以下是代码:=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
using System;=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
using System.Reflection;=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
namespace UseRefection=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
{=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
   
///=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
<summary>=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
   
/// Class1 的摘要说明。=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
   
///=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
</summary>=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
class Class1=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
{=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
       
///=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
<summary>=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
       
/// 应用程序的主入口点。=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
       
///=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
</summary>=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
        [STAThread]=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
       
static void Main(string[] args)=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
        {=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
           
//=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
           
// TODO: 在此处添加代码以启动应用程序=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
           
//=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
            Assembly assemFile    =    Assembly.LoadFile(@"F:\Source\shipfi\MyTestCode\CSConsole\反射\被调用的类\MyClass\bin\Debug\myclass.exe");=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
            Type myAppType   
=    assemFile.GetType("MyClass.UseClass"); //获取UseClass类的类型=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
            ConstructorInfo cInfo   
=    myAppType.GetConstructor(new Type[]{}); //获得UseClass的构造函数,并且,使用第一个不带参数的构造函数=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
object app    =    cInfo.Invoke(new object[]{}); //调用构造函数生成对象。=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
           
//以下是生成一个UseClass对象,并且以有参数的构造函数来生成=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
            Type inttype    =typeof(int);=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
            ConstructorInfo cInfo2   
=    myAppType.GetConstructor(new Type[]{inttype});=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
           
object app2    =    cInfo2.Invoke(new object[]{4});=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
            =»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
           
//调用AddAccount(3)方法=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
object str    =    myAppType.GetMethod("AddAccount").Invoke(app,new object[]{3});=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
           
//获得函数的返回值,并输出=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
object str2    =    myAppType.GetMethod("ReturnAccount").Invoke(app2,new object[]{});=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
            Console.WriteLine((
int)str2);=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
            Console.ReadLine();=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
        }=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
    }=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz
}
=»5ùÝ<www.netcsharp.cnM·0Þ1„+Íiz