最近由于业务要求,需要动态调DLL类库,所以研究了一下,感觉还好也不太难,今天就把自己理解一个小例子(已经通过VS2005跑通),供大家一起研究探讨,有理解不当地方还请高手们多多指正,谢谢啦!

好,在这之前我先把反射所需要使几个类给大家列一下:

1、使Assembly类定义加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型实例。

2、使MethodInfo了解方法名称、返回类型、参数、访问修饰符(如pulic 或private)实现详细信息(如abstract或virtual)等。使TypeGetMethods或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 = ;
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>
/// 求和方法
/// 第三种方式
/// </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 = ;
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[]);
MethodInfo method2 = type.GetMethod(this.strMetName[]);
MethodInfo method3 = type.GetMethod(this.strMetName[]);
//对获取的类进行创建实例。//必须使用名称空间+类名称
obj = ass.CreateInstance(this.strDllName + "." + this.strClaName);
//开始搜索方法
method1 = type.GetMethod(this.strMetName[]);//方法的名称1
method2 = type.GetMethod(this.strMetName[]);//方法的名称2
method3 = type.GetMethod(this.strMetName[]);//方法的名称3
object[] parts = new object[];
parts[] = x;
parts[] = y;
//方法的调用
//注:如果调用的DLL类库中方法是静态的,那么Invoke方法中第一个参数传值为NULL。
// 如果方法不是静态的,那么Invoke方法中第一个参数传值为 obj(上面那个被实例的对象)
method1.Invoke(obj, parts);
Console.WriteLine("调用的方法 " + this.strMetName[] + ": " + x + " + " + y + " = " + parts[]);
int sum1 = (int)method2.Invoke(obj, new object[] { x + , y + });
Console.WriteLine("调用的方法 " + this.strMetName[] + ": " + (x + ) + " + " + (y + ) + " = " + sum1); object[] temParts = new object[];
temParts[] = x + ;
temParts[] = y + ;
method3.Invoke(null, temParts);
Console.WriteLine("调用的方法 " + this.strMetName[] + ": " + temParts[] + " + " + temParts[] + " = " + temParts[]);
}
}
}
}

在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(,);
}
}
}

好了。现在可以跑一下如何调了,大家可以设置在调试模式下进行阅读代码。

利用C#的反射机制动态调用DLL类库的更多相关文章

  1. C# 通过反射类动态调用DLL方法

    网上看了很多关于反射的思路和方法,发现这个还算不错 //使用反射方: using System; using System.Collections.Generic; using System.Linq ...

  2. C#程序实现动态调用DLL的研究(转)

    摘 要:在<csdn开发高手>2004年第03期中的<化功大法——将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资 ...

  3. 用C#通过反射实现动态调用WebService 告别Web引用

    我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...

  4. C#程序实现动态调用DLL的研究[转]

    摘   要: 在< csdn 开发高手> 2004 年第 03 期中的<化功大法——将 DLL 嵌入 EXE >一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在 ...

  5. C#程序实现动态调用DLL的研究

    摘 要:在<csdn开发高手>2004年第03期中的<化功大法——将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资 ...

  6. 用C#通过反射实现动态调用WebService 告别Web引用(转载)

    我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...

  7. Java反射机制动态代理

    1.什么事反射机制动态代理 在一段代码的前后动态执行其他操作,比如有一个方法是往数据库添加一个记录,我们可以通过动态代理,在操作数据库方法的前和后添加代码执行打开数据库连接和关闭数据库连接. 2.演示 ...

  8. C++利用模板在Windows上快速调用DLL函数

    更新日志 --------- 2021/08/01 更新V2.2 增加 GetHmodule 函数 - 允许用户获取HMODULE以验证加载DLL是否成功. 2021/08/03 更新V2.3 增加 ...

  9. 卸载AppDomain动态调用DLL异步线程执行失败

    应用场景 动态调用DLL中的类,执行类的方法实现业务插件功能 使用Assembly 来实现 但是会出现逻辑线程数异常的问题 使用AppDomain 实现动态调用,并卸载. 发现问题某个插件中开启异步线 ...

随机推荐

  1. iOS中控件的Frame属性和Bounds属性的区别

    在iOS中,每个控件都是继承于UIView的,都会有视图的属性存在,控制这个视图的位置就有Frame和Bounds两个属性 frame指的是:该view在父view坐标系统中的位置和大小.(参照点是父 ...

  2. Java获取当前路径

    1.利用System.getProperty()函数获取当前路径:System.out.println(System.getProperty("user.dir"));//user ...

  3. mysql in查询 结果乱序 引发的思考

    Mysql in查询 结果集 乱序 SQL: select * from table where id IN (3,6,9,1,2,5,8,7); 这样的情况取出来后,其实,id还是按1,2,3,4, ...

  4. 用java写随机出题

    import java.io.*; //输入函数包 public class hello{ public static void main(String args[]){ String s=" ...

  5. 3proxy 二级代理配置样例

    适应情况: 有时,我们的机器HOST-A只能通过代理服务器HOST-B才可以访问internet, 而与我们相连的机器HOST-C也需要访问internet, 但是HOST-C却不能直接访问HOST- ...

  6. Linux 下DNS服务器主从配置

    注意: 关闭防火墙  关闭selinux  在客户端配置vim /etc/resolv.conf的DNS  安装  yum install -y bind bind-chroot bind-utils ...

  7. Javascript触屏手势库-JTouch(更新V1.1)

    作者:痞子|时间:2013-05-21|分类目录:js,javascript,jquery教程|Tag标签: javascript.jTouch|阅读(857) 7 条评论 Javascript触屏手 ...

  8. (C#)与Windows用户账户信息的获取

    Console.WriteLine(Environment.UserName); //计算机NetBIOS名称 Console.WriteLine(Environment.MachineName); ...

  9. Linux内核之mmc子系统-sdio

    现在的Linux内核中,mmc不仅是一个驱动,而是一个子系统.这里通过分析Linux3.2.0内核,结合TI的arm335x平台及omap_hsmmcd host分析下mmc子系统,重点关注sdio及 ...

  10. Java基础知识强化之集合框架笔记14:List集合存储字符串并遍历

    1. List集合存储学生对象并遍历: 需求:存储字符串并遍历 分析: (1)创建集合对象 (2)创建字符串对象 (3)添加字符串对象到集合中 (4)遍历集合 2. 代码示例: package cn. ...