谈谈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

http://blog.junwen38.com/archives/656

posted @ 2019-09-03 16:24  吴小波  阅读(234)  评论(0编辑  收藏  举报