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键进行调试,进一步了解它是怎么运作的。