• C#利用反射机制调用dll


    利用反射进行动态加载和调用.
    Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll
    Assembly.LoadFile 只加载指定文件,并不会自动加载依赖程序集.Assmbly.Load无需后辍名,加载dll后,需要使用dll中某类.
    Type type=ass.GetType(“TypeName”);//利用类型的命名空间和名称获得类型需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略
    Object obj = Activator.CreateInstance(type,params[]);//利用指定的参数实例话类型,调用类型中的某个方法:
    需要首先得到此方法
    MethodInfo mi=type.GetMethod(“MehtodName”);//通过方法名称获得方法
    然后对方法进行调用,多态性利用参数进行控制
    mi.Invoke(obj,params[]);//根据参数直线方法,返回值就是原方法的返回值
    主要操作步骤如下:
    Assembly ass = System.Reflection.Assembly.LoadFile(@"d:TestReflect.dll");//要绝对路径
    type = ass.GetType("Webtest.ReflectTest");//必须使用名称空间+类名称
    System.Reflection.MethodInfo method = type.GetMethod("WriteString");//方法的名称
    obj = ass.CreateInstance("Webtest.ReflectTest");//必须使用名称空间+类名称
    string s = (string)method.Invoke(obj,new string[]{"jianglijun"}); //实例方法的调用

    实际操作使用,创建一个类库项目。首先创建一个类:用于做简单的运算测试

    namespace dlltest
    {
    public class Class1
    {
    decimal x = 0;
    decimal y = 0;
    
    public decimal add(decimal x, decimal y)
    {
    return x + y;
    }
    
    public decimal sub(decimal x , decimal y)
    {
    return x - y;
    }
    
    public decimal mul(decimal x, decimal y)
    {
    return x * y;
    }
    public decimal div(decimal x, decimal y)
    {
    return x / y;
    }
    }
    }

    将上面的程序生成dll 类库,放到 第二个项目(控制台程序,这里只作测试)的debug目录下。

    ///此处略去部分代码,用于获取两个输入的数字, 可自定义或读取输入
    
    Assembly ass = Assembly.Load("dlltest"); //加载dll
    
    Type type = ass.GetType("dlltest.Class1"); //获取该类 命名空间 + 类名, Class1 是我的类名
    MethodInfo mi1 = type.GetMethod("add"); //获取方法 
    MethodInfo mi2 = type.GetMethod("sub");
    MethodInfo mi3 = type.GetMethod("mul");
    MethodInfo mi4 = type.GetMethod("div");
    Object obj = ass.CreateInstance("dlltest.Class1");//必须使用名称空间+类名称
    
    //以下是调用该四种方法
    decimal rs1 = (decimal)mi1.Invoke(obj, new object [] { x, y }); //obj, new decimal[] {a, b}
    decimal rs2 = (decimal)mi2.Invoke(obj, new object[] { x, y });
    decimal rs3 = (decimal)mi3.Invoke(obj, new object[] { x, y });
    decimal rs4 = (decimal)mi4.Invoke(obj, new object[] { x, y });
    
    Console.WriteLine();
    Console.WriteLine("加法结果: " + rs1);
    Console.WriteLine("减法结果: " + rs2);
    Console.WriteLine("乘法结果: " + rs3);
    Console.WriteLine("除法结果: " + rs4);

    以下是结果显示:

    假如不想将dll放到 debug目录下,可以获取 应用程序的主目录,然后将dl 放到主目录中。(此处只是一种方法,你可以不需要复制过来,而直接将目录指向 dlltest.dll的生成目录)

    只需如下处理:

    DirectoryInfo dir = new DirectoryInfo(AppDomain.CurrentDomain.SetupInformation.ApplicationBase).Parent.Parent;
    string str = dir.FullName; //获取或设置包含该应用程序的目录的名称
    Assembly ass = Assembly.Load(str + "\" + "dlltest"); //加载dll
    
    //后续操作不变

    谢谢阅读!分享共进步

  • 相关阅读:
    bzoj1096 [ZJOI2007]仓库建设
    bzoj2054 疯狂的馒头
    bzoj1597 [Usaco2008 Mar]土地购买
    【洛谷P1083】[NOIP2012]借教室
    【洛谷P1367】蚂蚁
    【洛谷P1886】滑动窗口
    【洛谷P2216】[HAOI2007]理想的正方形
    【题解】洛谷P2914[USACO08OCT]断电Power Failure
    【数据结构】数组模拟链表
    【题解】洛谷P1002过河卒
  • 原文地址:https://www.cnblogs.com/imyao/p/5263401.html
Copyright © 2020-2023  润新知