曾经在网上搜过不少方法,也发贴问过,对于动态加载DLL的方法,仿佛使用反射的方法是最常规的处理意见,但真正到了自己运用时,才知道还是没有理解到真正的方法,特再次高分求解!
1、首先,被调用的DLL文件与程序都属于自己编写的,命名空间相同;
2、由于管理需要,(假设)被调用的DLL文件全部放在D:\ERP\DD文件夹内,程序放到D:\ERP\PRO文件内;
3、DLL文件里设有:域、属性、静态方法、非静态方法等,构造函数包含4个string参数,必须带参数实例化;
问题:
1、D:\ERP\PRO文件内的程序,如何在启动时或某个事件动态加载D:\ERP\DD文件夹内的DLL文件?
2、如何取出DLL文件里域的值,或调用DLL文件里的方法静态或非静态方法?
网上找过很多方法都不行,只好求代码!

解决方案 »

  1.   

    补充说明一下:DLL文件里的方法也有多个参数与无参数之分!
      

  2.   

    带参数实例化类object[] objPara = new oobject[]...
    _objAssembly.CreateInstance("类名", false, BindingFlags.Default, null, objPara, null, null);
      

  3.   


    CreateInstance方法会根据你的参数个数,类型,自动进行匹配有效的构造函数进行实例化
      

  4.   

    编写插件dll最简单的就是提供一个单独的接口dll。
    interface IMy
    {
       // 你要调用的方法...
    }扩展dll实现接口,调用就非常方便了。IMy imy = null;
    Assembly assembly = ...;
    foreach(Type t in assembly.GetTypes())
    {
        if(typeof(IMy).IsAssignableFrom(t))
        {
           imy = Activator.CreateInstance(t) as IMy;
        }
    }
    imy.你要调用的方法();
      

  5.   

    我项目中的动态加载,工作的很好。
    根据标志加载不同目录下的dll.它们都实现了同样的接口
    IGenerator generator = null;
    if (pfsOrder.isSrmDevice)
    {
    assembly = Assembly.LoadFrom( basePath + "AccessCodeGenerator\\SnakeEyes\\Fulfilment.AccessCodes.SnakeEyes.dll" );
    generator= (IGenerator) assembly.CreateInstance( "Pongrass.PES.Fulfilment.AccessCodeGeneratorSnakeEyes" );}
    else
    {
    assembly = Assembly.LoadFrom( basePath + "PES.Fulfilment.AccessCodes.dll" );
    generator= (IGenerator) assembly.CreateInstance( "Pongrass.PES.Fulfilment.AccessCodeGenerator" );
    }
    带参数的构造函数参见3楼回答
      

  6.   

    说心里话,接口的方法至今没有学会,请大家不要笑话;
    2楼给的链接早看过了,也打印出来实作过,但里没有调用DLL里的域或属性的方法,只讲了怎么设用其中方法!
      

  7.   

    补充一点,DLL中的类,需要继承并实现这个接口
      

  8.   

    看来我是没有表达清楚,我花了好几天时间,这个问题依然没有得到解决。
    DLL文件其实一个关于权限的类,我不想写到每个一程序中,而希望每个程序直接去调用这个DLL类库:
     public class PowerControl
    {
        public string serverIP;
        public string serverUser;
        public string serverPwd;
        public bool rSee;                 //查询
         public bool rAlter;               //修改
         public bool rDel;                 //删除
         public bool rSanction;            //审核
          /// <summary>
         /// 构造函数
          /// </summary>
         public PowerControl(string ServerIP, string ServerUser, string ServerPwd)
        {
            serverIP = ServerIP;
            serverUser = ServerUser;
            serverPwd = ServerPwd;
        }
        public void SetPowerControl()
        {
            ...........//很长一串从数据库取出权限值,已测试没有问题;
            rSee=StrToBool(rPower.Substring(1, 1));       //查询
            rAlter=StrToBool(rPower.Substring(2, 1));     //修改
             rDel=StrToBool(rPower.Substring(3, 1));       //删除
             rSanction=StrToBool(rPower.Substring(4, 1));  //审核
        }
         private bool StrToBool(string YorN)
         {
            if (YorN == "Y")
                    return true;
             else
                    return false;
         }
    }然后程序怎么去调用这个DLL文件,并获取DLL文件中SetPowerControl方法后rSee,rAlter,rDel,rSanction的值作为本程序权限的设定?
      

  9.   


    如果都要用到PowerControl类,而不是需要动态插拔。
    那么直接添加到PowerControl项目的引用就可以了。
      

  10.   

    不在同一个目录下,6楼给出类加载dll的assembly的方法
    然后反射调用即可。当然,也可以开发直接应用,部署时,先运行加载的方法,然后调用主程序的入口即可。----------------
    通用的bootstrap,都一般是这么做的,自己加载dll
      

  11.   


    Type type=assembly.GetType("PowerControl的全名");
    Object obj=Activator.CreateInstance(type,serverip,serveruser,serverpwd);
    MethodInfo info=type.GetMethod("SetPowerControl");info.Invoke(obj,null);  //调用SetPowerControl方法取rSee,rAlter,rDel,rSanction的值,方法差不多FieldInfo field=type.GetField("rSee");
    object rsee=field.GetValue(obj);