谈谈C#反射(Reflection)
反射是什么?官方给出的解释:反射提供了封装程序集、模块和类型的对象(System.Type类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。
个人理解:在运行态下,动态访问、修改自身的功能。今天我们利用反射为程序动态加载程序集(Assembly),System.Reflection命名空间是我们实现该功能的基础。
代码如下:
public static void Main(string[] args)
{
//AssemblyResolve事件在.Net对程序集解析失败时触发,返回一个Assembly对象。
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(OnResolve);
//功能
Startup();
}
public static Assembly OnResolve(object sender, ResolveEventArgs args)
{
var assemblyName = new AssemblyName(args.Name);
string path = "";
if (assemblyName.Name.EndsWith("WuXiaoBo"))
path = @"C:\Program Files\Java\wuxiaobo.dll";
if (string.IsNullOrEmpty(path) == false
&& File.Exists(path))
return Assembly.LoadFrom(path);
return null;
}
public static void Startup()
{
//调用程序集中包含的接口,接口不能直接放在Main中。
}
代码很简单,就不过多解释了。
参考资料:
https://docs.microsoft.com/zh-cn/dotnet/api/system.appdomain.assemblyresolve?view=netframework-4.6.1
https://www.cnblogs.com/darrenji/archive/2014/09/26/3995450.html