动态加载DLL可以使程序部署更加灵活简单。C#的反射机制提供了动态加载DLL的方法。
动态加载DLL是为了调用同一接口、不同实现。在此我们先定义接口
public interface DLLIneterface { int Calulate(int x, int y); }
然后对于这个计算,实现一个加法和一个减法。
加法的实现。编译的DLL名字为AddDLL.dll
namespace AddDLL { public class Add : DLLIneterface { public int Calulate(int x, int y) { return x + y; } } }
减法的实现,编译的DLL名字为MinusDLL
namespace MinusDLL { public class Minus : DLLIneterface { public int Calulate(int x, int y) { return x - y; } } }
之后在主程序中实现动态加载。在加载之前,要把相应的DLL放到Debug或Release目录下,或者加载时使用绝对路径。
主程序:
namespace DynamicLoadDLL { class Program { static void Main(string[] args) { Assembly assembly = Assembly.Load("AddDLL"); Type type = assembly.GetType("AddDLL.Add"); MethodInfo DLLMethod = type.GetMethod("Calulate"); object obj = Activator.CreateInstance(type); object[] paras = new object[2] { 5, 2 };//参数 object result = DLLMethod.Invoke(obj, paras); Console.WriteLine(result); } } }
其中Assembly要用到命名空间System.Reflection。
Assembly.Load为加载DLL程序集,不用加后缀名。
Type type = assembly.GetType("AddDLL.Add");为获取程序集中的类。我使用Add类来实现接口。AddDLL为命名空间。
MethodInfo DLLMethod = type.GetMethod("Calulate");获取要调用的方法。
object obj = Activator.CreateInstance(type);type为程序集中类的类型,这条语句是创建了类的实例。如果是调用static类型函数,则无需创建实例。在下面的<span style="font-family:Arial, Helvetica, sans-serif;">DLLMethod.Invoke(obj,paras)中的obj可以null代替。
Invoke(object obj, object[] paras)为调用方法。其中obj为类的实例。而paras为参数的集合。返回类型用object。