C#反射之动态加载dll,并使用其中的函数

2018-8-15日,晴。

C#反射学习之小记。

运用反射运行dll中的方法,虽然如果知道dll内的内容可以直接实例化,然后运用函数。

但是反射它有更多更好的用途。

使用写一个测试的dll;

打开visual studio,我这边使用的是vs2017。

将class1的命名更改为assembly_class,出现提示是否全部重命名,选择确定。

测试dll代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace assembly_name
{
    public class assembly_class
    {
        public string Show_Str(string str)//单参数
        {
            if (string.IsNullOrEmpty(str))
                return "你没有传参数进来";
            else
                return "有参数,参数是" + str;
        }

        public void Sum(int x, int y, out int sum)//多个同类型参数
        {

            sum = x + y;

            //return sum;
        }

        public string SumToString(int x, int y, out string sum)//多个不同类型参数
        {
            sum = (x + y).ToString();
            return sum;
        }

        public static void SumToStatic( int x ,int y,out int sum)//静态参数
        {
            sum = 0;
            sum = x + y;
        }

    }
}

y右击解决方案,添加-新建项目

显示部分代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Reflection;


namespace Xianshi
{
    class Program
    {
        static void Main(string[] args)
        {         
            //var x = AppDomain.CurrentDomain.BaseDirectory;//可以获得大概地址
            //获取并加载DLL
            Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "assembly_name.dll");
            //获取类的类型:必须使用名称空间+类名称
            Type type = assembly.GetType("assembly_name.assembly_class");
            //获取类的方法
            MethodInfo method1 = type.GetMethod("Show_Str");
            //对获取的类进行创建实例,必须使用名称空间+类名称
            object obj = assembly.CreateInstance("assembly_name.assembly_class");
            //单参数的传入
            method1 = type.GetMethod("Show_Str");
            object[] parts1 = new object[1];
            parts1[0] = "jiaopeng";
            var value = method1.Invoke(obj, parts1);
            Console.WriteLine(value);
            //多个相同类型的参数传入
            MethodInfo method2 = type.GetMethod("Sum");
            object[] parts2 = new object[3];
            parts2[0] = 100;
            parts2[1] = 200;
            method2.Invoke(obj, parts2);
            Console.WriteLine(parts2[2]);
            //多个不同参数的传入
            MethodInfo method3 = type.GetMethod("SumToString");
            object[] parts3 = new object[3];
            parts3[0] = 100;
            parts3[1] = 200;
            method3.Invoke(obj, parts3);
            Console.WriteLine(parts3[2]);
            //静态方法的参数传入,out参数要初始化
            MethodInfo method4 = type.GetMethod("SumToStatic");
            object[] parts4 = new object[3];
            parts4[0] = 101;
            parts4[1] = 201;
            method4.Invoke(null, parts4);
            Console.WriteLine(parts4[2]);

        }
    }
}

进入到测试assemnly_name代码页面,点击项目-assemnly_name的属性,讲输出路径改到Xianshi-Bin-Debug的目录下,然后保存退出(保存 ctrl+S)。

在xianshi的代码页面,你可以通过使用F11键进行调试,进一步了解它是怎么运作的。

参考文章:https://blog.csdn.net/3150379/article/details/44118173

猜你喜欢

转载自blog.csdn.net/qq_39412924/article/details/81704337