.Net常用技巧_动态加载Dll

原理如下:

1、利用反射进行动态加载和调用.

Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll

Assembly.LoadFile 只加载指定文件,并不会自动加载依赖程序集.Assmbly.Load无需后辍名

 

2、加载dll后,需要使用dll中某类.

Type type=ass.GetType(“TypeName”);//用类型的命名空间和名称获得类型

 

3、需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略

Object obj =Activator.CreateInstance(type,params[]);//利用指定的参数实例话类型

 

4、调用类型中的某个方法:

       注:如果是类的静态方法,可以直接调用,如: string strReturn = (string) type.InvokeMember("GetNewValue",BindingFlags.DeclaredOnly|BindingFlags.Public|BindingFlags.Static|BindingFlags.InvokeMethod,null,       null, new object[]{ 12 } );

 

需要首先得到此方法

MethodInfo mi=type.GetMethod(“MehtodName”);//通过方法名称获得方法

 

5、然后对方法进行调用,多态性利用参数进行控制

mi.Invoke(obj,params[]);//根据参数直线方法,返回值就是原方法的返回值

 

#region 声明动态载入DLL的参数

       object obj=null;

       byte[] filesByte;

       Assembly assembly;

       Type type;

       MethodInfo timerInitial;

       MethodInfo timerDispose;

#endregion


      private void LoadDll()//加载DLL 
       {
            try

           {
                filesByte =File.ReadAllBytes(Path.GetDirectoryName(Application.ExecutablePath) +"\\loadDll.dll");

                assembly =Assembly.Load(filesByte);
                type =assembly.GetType("test.loadDll");
                obj =System.Activator.CreateInstance(type);
                timerStart =tp.GetMethod("TimerStart");
                timerStop =tp.GetMethod("TimerStop");
                if (timerStart != null)
                {
                    timerStart.Invoke(obj,null);
                }
           }
           catch(Exception)
           {

           }
       }

 

以下摘自MSDN

public class A
{
   public virtual int method () {return 0;}
}

public class B
{
   public virtual int method () {return 1;}
}

class Mymethodinfo
{
   public static int Main()
    {
       Console.WriteLine ("\nReflection.MethodInfo");
       A MyA = new A();
       B MyB = new B();

       // Get the Type and MethodInfo.
       Type MyTypea = Type.GetType("A");
        MethodInfo Mymethodinfoa =MyTypea.GetMethod("method");
 
       Type MyTypeb = Type.GetType("B");
       MethodInfo Mymethodinfob = MyTypeb.GetMethod("method");

       // Get and display the Invoke method.
       Console.Write("\nFirst method - " + MyTypea.FullName +
           " returns " + Mymethodinfoa.Invoke(MyA, null));

       Console.Write("\nSecond method - " + MyTypeb.FullName +
           " returns " + Mymethodinfob.Invoke(MyB, null));

       return 0;
    }
}

 

.Net常用技巧_动态加载Dll,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。