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