zoukankan      html  css  js  c++  java
  • CLR Via CSharp读书笔记(23):程序集加载和反射

    #1 加载程序集

    Assembly.Load:

    public class Assembly
    {
        public static Assembly Load(AssemblyName assemblyRef);
        public static Assembly Load(String assemblyString);
    }

    在内部,Load导致CLR向应用程序集应用一个版本绑定重定向策略,并在GAC中查找程序集。如果传递的是一个弱命名程序集,不会应用版本绑定重定向策略,也不会去GAC中查找程序集。

    AppDomain.Load:

    public class AppDomain
    {
        public Assembly Load(String assemblyString);
    }

    AppDomain.Load 是一个实例方法,为了加载程序集,CLR将使用与指定AppDomain关联的设置,而不是与发出调用的那个AppDomain相关联的设置。一般要避免使用。

    Assembly.LoadFrom:

    public class Assembly
    {
        public static Assembly LoadFrom(String path);
    }

    在内部,AssemblyName.GetAssemblyName(String assemblyName)-->Assembly.Load(AssemblyName assemblyRef); 然后CLR应用版本绑定重定向策略。LoadFrom允许传递一个URL作为实参,例:

    Assembly a = Assembly.LoadFrom(@"http://wintellect.com/SomeAssembly.dll");

    Assembly.LoadFile:

    public class Assembly
    {
        public static Assembly LoadFile(String path);
    }

    LoadFile可以从任意路径加载一个程序集,CLR不会自动解析任何依赖性问题。需要通过AssemblyResolve事件登记,让回调方法显示加载依赖的程序集。

    Assembly.ReflectionOnlyLoadFrom & Assembly.ReflectionOnlyLoad:

    public class Assembly
    {
        public static Assembly ReflectionOnlyLoadFrom(String assemblyFile);
        public static Assembly ReflectionOnlyLoad(String assemblyString);
    }

    ReflectionOnlyLoadFrom加载路径指定文件,不会获取强名称,也不会再GAC和其他位置搜索文件;

    ReflectionOnlyLoad会在GAC、应用程序基目录、私有路径和codebase指定位置搜索程序集,但不会应用版本控制策略。加载哪个版本,获得的就是哪个版本。CLR禁止上边两种方式加载的程序集中的任何代码执行。

    仅部署一个EXE文件的做法:对于添加的DLL,将其属性中的“生成操作”更改为“嵌入的资源”。运行时,CLR找不到依赖的DLL程序集,需要做如下处理。

    #2 反射的应用

    发现程序集中定义的类型:

    类型对象的准确含义:

    c#操作符(typeof),测试精确匹配;is/as操作符,测试的是兼容匹配(可以匹配派生对象)。

    构建Exception派生类的一个实例:

    #3 设计支持加载项的应用程序

    #4 使用反射发现类型的成员

    #5 发现类型的接口

  • 相关阅读:
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1068:与指定数字相同的数的个数
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1068:与指定数字相同的数的个数
    信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1067:整数的个数
    SSLZYC 2405 巧克力
    SSLZYC 2404 上学
    SSLZYC 2403 蜡烛
    SSLZYC 2402 世界语
    SSLZYC 2124 涂色
    SSLZYC 2391 数列
    SSLZYC 洛谷 P1498 南蛮图腾
  • 原文地址:https://www.cnblogs.com/thlzhf/p/2805506.html
Copyright © 2011-2022 走看看