zoukankan      html  css  js  c++  java
  • 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
    
    //后续操作不变

    谢谢阅读!分享共进步

  • 相关阅读:
    序列JSON数据和四种AJAX操作方式
    jquery.validate和jquery.form.js实现表单提交
    JQuery Validate使用总结1:
    HOWTO: Include Base64 Encoded Binary Image Data (data URI scheme) in Inline Cascading Style Sheets (CSS)(转)
    SharePoint 2007 使用4.0 .Net
    动态IP解决方案
    取MS CRM表单的URL
    从Iframe或新开的窗口访问MS CRM 2011(转)
    Toggle or Hidden MS CRM Tab
    Windows 2008下修改域用户密码
  • 原文地址:https://www.cnblogs.com/imyao/p/5263401.html
Copyright © 2011-2022 走看看