C#通过反射加载外部程序集(dll库文件)
本文章使用了一个C#通过反射加载一个类库的dll文件,获取库文件中的公共成员,执行这些变量
反射基础整理传送门
说明:
这个dll文件和我们的反射不在同一个程序集中
测试代码
将这个脚本类库打包成dll库文件
namespace 程序集
{
public enum E_Type {
Cat,
Dog
}
class TestClass
{
public int id = 01;
public string strId = "零零";
#region 构造方法
public TestClass() { }
public TestClass(int id) {
this.id = id;
}
public TestClass(int id,string str):this(id)
{
this.strId = str;
}
#endregion
//输出动物叫
public string AniWow(E_Type type)
{
string wow = "";
switch (type)
{
case E_Type.Cat:
wow = "喵喵";
break;
case E_Type.Dog:
wow = "狗狗";
break;
default:
break;
}
return wow;
}
}
}
通过反射获取
这里代码注释说的很明白,不再细说
class Program
{
static void Main(string[] args)
{
//1.加载程序集
Assembly assembly = Assembly.LoadFile(@"C:\Users\Administrator\source\repos\CSharp反射\程序集\bin\Debug\程序集.dll");
//获取程序集下所有公共成员(类 枚举 结构体 )等等
Type[] types = assembly.GetTypes();
//获取程序集下的枚举
Type e_type = assembly.GetType("程序集.E_Type");
//获取具体的枚举变量就跟获取公共变量一样
FieldInfo Info_Cat = e_type.GetField("Cat");
Type test = assembly.GetType("程序集.TestClass");
//实例化一个对象
object obj = Activator.CreateInstance(test,1);
//获取TestClass中的方法
MethodInfo mInfo = test.GetMethod("AniWow");
//执行方法 传入一个对象,如果是静态方法第一个参数为null几个,用object数组来传递对应参数
object o= mInfo.Invoke(obj, new object[] {Enum.Parse(e_type,"Dog") });
Console.WriteLine(o);
//当我们不知道程序集中有什么,我们可以通过相关API打印获取
//FieldInfo[] infos = e_type.GetFields();
//for (int i = 0; i < infos.Length; i++)
//{
// Console.WriteLine(infos[i]);
//}
Console.ReadKey();
}
}
到此我们可以正确的调用库文件中的AniWow()的方法了
在我们使用其它程序集中的成员变量,我们可能不知道里边都有什么,我们可以通过Type中的方法,获取这些公共的成员变量。
Type[] types = assembly.GetTypes();
打印数组中的元素:
总结:
加载程序集的一般步骤:
- 首先使用Assembly.LoadFile()或者Assembly.LoadForm()加载我们所需加载的程序集
- 然后再获取程序集中的公共的类,因为不是一个程序集,这里传入的参数一定是带有
命名空间
的,否则获取不到 例如:System
.Int32
3.再通过基本的API去获取我们想要获取的内容,然后去操作它们。