装载外部DLL 全攻略 (转)

动态加载DLL教程
本文详细介绍了一种使用C#动态加载外部DLL文件的方法。通过反射机制,可以实现无需重新编译主程序即可调用DLL中的方法,包括定位DLL文件、加载DLL、获取类型信息及实例化并调用指定方法的全过程。
装载外部DLL 全攻略 (转)[@more@]

例DLL 文件内容如下:

using System;
using System.windows.Forms;

namespace ArLi.CommonPrj {
 public class ShowAboutBox {
 public static void ShowOn(FoRM fm) {
 MessageBox.Show("OK");
 }
 }
}

编译后文件名叫 AboutBox.dll

程序调用方法如下:

//定义文件名
FileInfo aBoxFile = new FileInfo(Path.Combine(Application.StartupPath,"AboutBox.dll"));

if (aBoxFile.Exists) { //如果存在
 try { //预防意外,比如不载不完整,非法DLL
 // 开始载入
 Assembly aBox = Assembly.LoadFrom(aBoxFile.FullName); 
 Type[] _t = aBox.GetTypes(); //获得全部Type
 foreach (Type t in _t) { //遍历
 //如果发现名称空间和类名有相符的
 if (t.Namespace == "ArLi.CommonPrj" && t.Name == "ShowAboutBox") {
 //载入方法
 MethodInfo m = t.GetMethod("ShowOn");
 if (m != null) { //如果要载入的方法存在
 //创建实例
 object o = Activator.CreateInstance(t);
 //执行该方法,后面的this 是参数
 m.Invoke(o,new object[]{this});
 }
 else { //载入的方法不存在
 MessageBox.Show("File "AboutBox.dll" Invalid! Method Error.");
 }
 return;
 }
 }
 MessageBox.Show("File "AboutBox.dll" Invalid! Assembly Name Error.");
 } //文件、命名空间、方法都相符,但执行该DLL 内容出错
 catch (System.NullReferenceException ex) {
 MessageBox.Show("File "AboutBox.dll" Invalid!");
 } //文件非正常DLL
 catch (Exception ex) {
 MessageBox.Show("File "AboutBox.dll" Error: " + ex.Message);
 }
}
else { //文件没找到
 MessageBox.Show("File "AboutBox.dll" Missing!");
}

说明1: 如果直接用 type t = gettype("arli.comm...") 这样也可以但如果此class 不存在就会出Exception
说明2:这种逆向反射动态载入无需定义装配件信息
说明3:此方法已经最大程度的进行了潜在的检测,除非非合法的WinDLL(比如下载的不完整),否则不会进入到很慢的 try catch


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-962572/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-962572/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值