使用反射调用其它应用程序中的方法
2005-09-24 10:14
411 查看
今天看到木帷幕的一篇文章,讲到如何用反射调用别人的.net程序。遂自己也根据他的理念实作了一遍。
我要调用的应用程序代码如下:
namespace MyClass
{
/// <summary>
/// Class2 的摘要说明。
/// </summary>
public class UseClass
{
protected int _account;
public UseClass()
{
_account=0;
}
public UseClass(int account)
{
_account=account;
}
public void AddAccount(int account)
{
_account+=account;
Console.WriteLine(_account);
}
public void MulAccount(int account)
{
_account-=account;
}
public int ReturnAccount()
{
return _account;
}
}
}
一,首先我们要获得这个应用程序的Assmebly对象。然后才在这个对象上进行操作。
Assembly assemFile = Assembly.LoadFile(@"F:\Source\shipfi\MyTestCode\CSConsole\反射\被调用的类\MyClass\bin\Debug\myclass.exe");
二,取得这个应用程序所需要的类的类型,这个Type是代表整个Class的。在这里是MyClass.UseClass类的类型。
Type myAppType = assemFile.GetType("MyClass.UseClass"); //获取UseClass类的类型
三,获得类的构造函数信息,并且构造它。且构造函数的Type保存至一Type变量中,以后调用该类的方法时,需要用到该构造函数信息。这里我们用无参数的构造函数来构造:
ConstructorInfo cInfo = myAppType.GetConstructor(new Type[]{}); //获得UseClass的构造函数,并且,使用第一个不带参数的构造函数
object app = cInfo.Invoke(new object[]{}); //调用构造函数生成对象。
如果要使用带参数的构造函数,可以像下面这样:
Type inttype = typeof(int);
ConstructorInfo cInfo2 = myAppType.GetConstructor(new Type[]{inttype});
object app2 = cInfo2.Invoke(new object[]{4}); //_account的默认值为4
这里,new Type[]{}大括号里面的参数得是Type类型,否则,如果写入int的话,编译器会出现错误。
完成之后,app或app2就是代表了构造函数的信息。而myAppType则代表的是类的信息。下面就是调用类中的方法了。
//调用AddAccount(3)方法,设置_account为3
object str = myAppType.GetMethod("AddAccount").Invoke(app,new object[]{3});
这里str保存的是函数返回值的信息,由于AddAccount返回值为Void.如果设置断点查看str的值的话,编译器会告诉你str是末定义的值。
再来看另一个调用的方法:
object str2 = myAppType.GetMethod("ReturnAccount").Invoke(app2,new object[]{});
Console.WriteLine((int)str2); //这个ReturnAccount用得是带参数的构造函数,所以,这里输出为4
由于ReturnAccount()是有返回类型,所以,str2可以转化为int类型输出。
以下是代码:
using System;
using System.Reflection;
namespace UseRefection
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
Assembly assemFile = Assembly.LoadFile(@"F:\Source\shipfi\MyTestCode\CSConsole\反射\被调用的类\MyClass\bin\Debug\myclass.exe");
Type myAppType = assemFile.GetType("MyClass.UseClass"); //获取UseClass类的类型
ConstructorInfo cInfo = myAppType.GetConstructor(new Type[]{}); //获得UseClass的构造函数,并且,使用第一个不带参数的构造函数
object app = cInfo.Invoke(new object[]{}); //调用构造函数生成对象。
//以下是生成一个UseClass对象,并且以有参数的构造函数来生成
Type inttype = typeof(int);
ConstructorInfo cInfo2 = myAppType.GetConstructor(new Type[]{inttype});
object app2 = cInfo2.Invoke(new object[]{4});
//调用AddAccount(3)方法
object str = myAppType.GetMethod("AddAccount").Invoke(app,new object[]{3});
//获得函数的返回值,并输出
object str2 = myAppType.GetMethod("ReturnAccount").Invoke(app2,new object[]{});
Console.WriteLine((int)str2);
Console.ReadLine();
}
}
}
关于反射,有好多方法及属性,我对它们一知半解,唉~~~
我要调用的应用程序代码如下:
namespace MyClass
{
/// <summary>
/// Class2 的摘要说明。
/// </summary>
public class UseClass
{
protected int _account;
public UseClass()
{
_account=0;
}
public UseClass(int account)
{
_account=account;
}
public void AddAccount(int account)
{
_account+=account;
Console.WriteLine(_account);
}
public void MulAccount(int account)
{
_account-=account;
}
public int ReturnAccount()
{
return _account;
}
}
}
一,首先我们要获得这个应用程序的Assmebly对象。然后才在这个对象上进行操作。
Assembly assemFile = Assembly.LoadFile(@"F:\Source\shipfi\MyTestCode\CSConsole\反射\被调用的类\MyClass\bin\Debug\myclass.exe");
二,取得这个应用程序所需要的类的类型,这个Type是代表整个Class的。在这里是MyClass.UseClass类的类型。
Type myAppType = assemFile.GetType("MyClass.UseClass"); //获取UseClass类的类型
三,获得类的构造函数信息,并且构造它。且构造函数的Type保存至一Type变量中,以后调用该类的方法时,需要用到该构造函数信息。这里我们用无参数的构造函数来构造:
ConstructorInfo cInfo = myAppType.GetConstructor(new Type[]{}); //获得UseClass的构造函数,并且,使用第一个不带参数的构造函数
object app = cInfo.Invoke(new object[]{}); //调用构造函数生成对象。
如果要使用带参数的构造函数,可以像下面这样:
Type inttype = typeof(int);
ConstructorInfo cInfo2 = myAppType.GetConstructor(new Type[]{inttype});
object app2 = cInfo2.Invoke(new object[]{4}); //_account的默认值为4
这里,new Type[]{}大括号里面的参数得是Type类型,否则,如果写入int的话,编译器会出现错误。
完成之后,app或app2就是代表了构造函数的信息。而myAppType则代表的是类的信息。下面就是调用类中的方法了。
//调用AddAccount(3)方法,设置_account为3
object str = myAppType.GetMethod("AddAccount").Invoke(app,new object[]{3});
这里str保存的是函数返回值的信息,由于AddAccount返回值为Void.如果设置断点查看str的值的话,编译器会告诉你str是末定义的值。
再来看另一个调用的方法:
object str2 = myAppType.GetMethod("ReturnAccount").Invoke(app2,new object[]{});
Console.WriteLine((int)str2); //这个ReturnAccount用得是带参数的构造函数,所以,这里输出为4
由于ReturnAccount()是有返回类型,所以,str2可以转化为int类型输出。
以下是代码:
using System;
using System.Reflection;
namespace UseRefection
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
Assembly assemFile = Assembly.LoadFile(@"F:\Source\shipfi\MyTestCode\CSConsole\反射\被调用的类\MyClass\bin\Debug\myclass.exe");
Type myAppType = assemFile.GetType("MyClass.UseClass"); //获取UseClass类的类型
ConstructorInfo cInfo = myAppType.GetConstructor(new Type[]{}); //获得UseClass的构造函数,并且,使用第一个不带参数的构造函数
object app = cInfo.Invoke(new object[]{}); //调用构造函数生成对象。
//以下是生成一个UseClass对象,并且以有参数的构造函数来生成
Type inttype = typeof(int);
ConstructorInfo cInfo2 = myAppType.GetConstructor(new Type[]{inttype});
object app2 = cInfo2.Invoke(new object[]{4});
//调用AddAccount(3)方法
object str = myAppType.GetMethod("AddAccount").Invoke(app,new object[]{3});
//获得函数的返回值,并输出
object str2 = myAppType.GetMethod("ReturnAccount").Invoke(app2,new object[]{});
Console.WriteLine((int)str2);
Console.ReadLine();
}
}
}
关于反射,有好多方法及属性,我对它们一知半解,唉~~~
相关文章推荐
- 使用反射跨包调用方法
- 在C#中使用反射调用internal的方法
- [c#美味] 使用反射动态创建实例并调用方法
- 不通过反射在其它类中直接调用access$000方法,即:如何绕过这个检查
- 第三部分 02 在ASP.NET AJAX应用程序中使用JavaScript异步调用Page的方法
- 微信开发三 使用反射根据消息类型自动调用不同方法
- 使用反射调用方法
- 调用其它的模版文件输出和模版类的display方法使用
- 【Android开发经验】使用反射,得到的类的字段、方法、并实现了简单的调用
- 使用反射机制实现jQuery调用ashx类中的指定方法
- 使用反射机制实现jQuery调用ashx类中的指定方法
- 使用反射构造对象实例并动态调用方法
- java反射调用配置文件构造类对象,使用其方法
- 使用反射机制调用service层方法Autowired标签自动注入失败
- 微信开发三 使用反射根据消息类型自动调用不同方法
- 使用反射-动态创建对象及调用对象方法
- 反射(四)使用反射机制调用对象的私有方法及成员变量
- C#构建多线程应用程序(1) —— 使用委托来自动创建次线程以实现异步方法的调用
- 使用反射调用一个类的方法
- AJAX使用反射调用指定类的方法