-- 作者:admin
-- 发布时间:11/9/2004 2:26:00 AM
-- 装载外部DLL 全攻略(转载)
发信人: Nineteen (-_-#!), 信区: DotNET 标 题: 装载外部DLL 全攻略(转载) 发信站: BBS 水木清华站 (Fri Dec 5 09:54:51 2003), 转信 装载外部DLL 全攻略 其它位置:CSDN Key: 装载外部DLL,Assembly,Type,反射,装配件. Author: ArLi @ http://www.zpcity.com/arli/ 例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!\n\nMethod Error."); } return; } } MessageBox.Show("File \"AboutBox.dll\" Invalid!\n\nAssembly Name Error."); } //文件、命名空间、方法都相符,但执行该DLL 内容出错 catch (System.NullReferenceException ex) { MessageBox.Show("File \"AboutBox.dll\" Invalid!"); } //文件非正常DLL catch (Exception ex) { MessageBox.Show("File \"AboutBox.dll\" Error: \n\n" + ex.Message); } } else { //文件没找到 MessageBox.Show("File \"AboutBox.dll\" Missing!"); } 说明1: 如果直接用 type t = gettype("arli.comm...") 这样也可以但如果此class 不存在就会出Exception 说明2:这种逆向反射动态载入无需定义装配件信息 说明3:此方法已经最大程度的进行了潜在的检测,除非非合法的WinDLL(比如下载的不完整),否则不会进入到很慢的 try catch 2003.9.10 -- ——长夜漫漫,无心睡眠……难道狼妹妹也睡不着吗? ※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.206.3.3] 上一篇 返回上一页 回到目录 回到页首 下一篇
|