利⽤C#的反射机制动态调⽤DLL类库
1、使⽤Assembly类定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查类型并创建该类型的实例。
2、使⽤MethodInfo了解⽅法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使⽤Type的GetMethods或GetMethod⽅法来调⽤特定的⽅法。
⼀、创建⽤于反射调⽤的DLL
using System;
using System.Collections.Generic;
using System.Text;
namespace RefDll
{
/// <summary>
/// 创建需要被调⽤的DLL类库
/// </summary>
public class RefTest
{
/// <summary>
/// 求和⽅法
/// </summary>
/// <param name="x">第⼀个值</param>
/// <param name="y">第⼆个值</param>
/// <param name="sum">结果(和)</param>
public void TestSum(int x,int y,out int sum)
{
sum = 0;
sum = x + y;
}
/// <summary>
/// 求和⽅法
/// 第⼆种⽅式
/// </summary>
/// <param name="x">第⼀个值</param>
/// <param name="y">第⼆个值</param>
/// <returns>结果(和)</returns>
public int TestSumTwo(int x, int y)
{
return x + y;
}
/// <summary>
/// 求和⽅法
param name
/// 第三种⽅式
/// </summary>
/// <param name="x">第⼀个值</param>
/// <param name="y">第⼆个值</param>
/// <param name="sum">结果(和)</param>
public static void TestSumThree(int x, int y, out int sum)
{
sum = 0;
sum = x + y;
}
}
}
⼆、应⽤于反射的例⼦
注:可以创建⼀个控制台的⼯程。
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Windows.Forms;
using System.IO;
namespace ReflectionLesson
{
/// <summary>
/// 反射类
/// 利⽤反射动态调⽤DLL类库。
/// </summary>
public class ReflectionLesson
{
private string strDllName = "";
private string strClaName = "";
private string[] strMetName = null;
/// <summary>
/// 构造⽅法
/// </summary>
/// <param name="DllName">调⽤的DLL类库名</param>
/// <param name="ClaName">调⽤的类名</param>
/// <param name="MetName">调⽤的⽅法名(数组)</param>
public ReflectionLesson(string DllName, string ClaName, string[] MetName)
{
//获取调⽤的DLL类库
this.strClaName = ClaName;
this.strDllName = DllName;
this.strMetName = MetName;
}
/// <summary>
/// 利⽤反射动态调⽤DLL类库
/// </summary>
public void ReflectionTest(int x,int y)
{
Assembly ass;
Type type;
object obj;
if (File.Exists(Application.StartupPath + "\\" + this.strDllName + ".dll"))
{
//获取并加载DLL类库中的程序集
ass = Assembly.LoadFile(Application.StartupPath + "\\" + this.strDllName + ".dll");
//获取类的类型:必须使⽤名称空间+类名称
type = ass.GetType(this.strDllName + "." + this.strClaName);
//获取类的⽅法:⽅法名称
MethodInfo method1 = type.GetMethod(this.strMetName[0]);
MethodInfo method2 = type.GetMethod(this.strMetName[1]);
MethodInfo method3 = type.GetMethod(this.strMetName[2]);
//对获取的类进⾏创建实例。//必须使⽤名称空间+类名称
obj = ass.CreateInstance(this.strDllName + "." + this.strClaName);
//开始搜索⽅法
method1 = type.GetMethod(this.strMetName[0]);//⽅法的名称1
method2 = type.GetMethod(this.strMetName[1]);//⽅法的名称2
method3 = type.GetMethod(this.strMetName[2]);//⽅法的名称3
object[] parts = new object[3];
parts[0] = x;
parts[1] = y;
/
/⽅法的调⽤
//注:如果调⽤的DLL类库中⽅法是静态的,那么Invoke⽅法中第⼀个参数传值为NULL。
//    如果⽅法不是静态的,那么Invoke⽅法中第⼀个参数传值为 obj(上⾯那个被实例的对象)
method1.Invoke(obj, parts);
Console.WriteLine("调⽤的⽅法 " + this.strMetName[0] + ": " + x + " + " + y + " = " + parts[2]);
int sum1 = (int)method2.Invoke(obj, new object[] { x + 10, y + 10 });
Console.WriteLine("调⽤的⽅法 " + this.strMetName[1] + ": " + (x + 10) + " + " + (y + 10) + " = " + sum1);
object[] temParts = new object[3];
temParts[0] = x + 20;
temParts[1] = y + 20;
method3.Invoke(null, temParts);
Console.WriteLine("调⽤的⽅法 " + this.strMetName[2] + ": " + temParts[0] + " + " + temParts[1] + " = " + temParts[2]);            }
}
}
}
在Main 函数中可以输⼊以下代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace ReflectionLesson
{
class Program
{
static void Main(string[] args)
{
string dllname = "RefDll";
string claname ="RefTest";
string[] metname = new string[]{"TestSum","TestSumTwo","TestSumThree"};            ReflectionLesson refl = new ReflectionLesson(dllname, claname, metname);            refl.ReflectionTest(100,200);
}
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。