装载外部DLL 全攻略

主  题:  装载外部DLL 全攻略
作  者:  ArLi2003 (阿利 路过.NET)
等  级:  ^^
信 誉 值:  100
所属论坛:  .NET技术 C#
问题点数:  0
回复次数:  13
发表时间:  2003-09-15 06:55:07

例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
说明4,如果还看不明白推荐看看超星图书的《C#技术内幕》

为避免贴子太长有问题的提问太后面,此贴无分

最后广告一篇旧做,标准气泡notifyicon,建议新手们瞧瞧:
http://www.csdn.net/Develop/Read_Article.asp?Id=20992



回复人: ArLi2003(阿利 路过.NET) ( 两星(中级)) 信誉:100 2003-09-15 07:04:00 得分:0

要注意里面的Activator.CreateInstance 已经建立了实例,所以 DLL 中的

public static void ShowOn

不一定要static,之所以设置为static 只是为那些将DLL 进行引用进工程的开发者而设

回复人: ehuar(彭华) ( 一级(初级)) 信誉:100 2003-09-15 13:47:00 得分:0

<good>study</good>

回复人: honghuixing(彗星) ( 一级(初级)) 信誉:100 2003-09-15 14:36:00 得分:0

能否解释

Application.StartupPath,"AboutBox.dll"));?
Activator.CreateInstance  ?
m.Invoke(o,new object[]{this});

回复人: lidi3503(天王) ( 一级(初级)) 信誉:100 2003-09-15 17:24:00 得分:0

又一个偶像诞生了

Contributors: FHL