现在的位置: 首页 > 综合 > 正文

C#动态加载DLL

2018年01月16日 ⁄ 综合 ⁄ 共 1236字 ⁄ 字号 评论关闭

动态加载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。

抱歉!评论已关闭.