.net 程序集的加载与反射

一. 程序集的加载:

  在CLR内部使用System.Reflection.Assembly类的静态LoadFrom方法尝试加载程序集。

      LoadFrom方法在内部调用Assembly的Load方法,将AssemblyName对象传给它,然后CLR应用版本绑定从定向策略,并在各个位置查询匹配的程序集。Load找到匹配的程序集就会加载它。如果Load没有找到匹配的程序集,LoadFrom会通过LoadFrom的实参传递的路劲中的程序集。

        //LoadFrom 根据已知的程序集路径加载程序集
        Assembly a = Assembly.LoadFrom("@c://query.dll");

    如果传递的是一个Internet位置,CLR会下载文件,吧它安装到用户的下载缓存中,再从那里加载。注意必须联网,否则会抛异常。但是如果是之前下载过的文件,然后再脱机状态下会使用以前下载的文件,不会抛出异常。

   还可以调用UnsafeLoadFrom,它能够加载从互联网上下载的程序集,同时绕过一些安全检查。

  一般其他工具是使用Assemly 的LoadFile方法任意加载程序集。

 

使用 Assembly.ReflectionOnlyLoadFrom 或Assembly.ReflectionOnlyLoad 加载程序集时,CLR静止程序集中的任何代码执行。试图执行由这两个方法加载的程序集中的代码时,CLR会抛出异常。

 

二. 使用反射构建动态可扩展应用程序。

   反射的相当强大的,允许在运行时发现并使用编译时还不了解的类型及其成员。但是,它也有两个缺点。

   a. 反射造成编译时无法保证类型安全。由于反射严重依赖字符串,所以会丧失编译时的类型安全性。

   b. 反射速度慢。使用反射时,类型及其成员在编译时位置;你要用字符串名称标示每个类型,及其成员,然后运行时发现他们。

       也就是说反射机制会不停的执行字符串搜索。

   利用System.Reflection命名空间包含的类型,可以反射解析对应元数据类型的字段,方法,属性,和事件。

 

三. 发现程序集中定义的类型

  Assembly的ExportedTypes属性: 显示其中定义的所有公开导出的类型

  

  static void Main(string[] args)
  {
            // 反射
            string dataAssembly = "System.Data,version=4.0.0.0,culture=neutral,PublicKeyToken=b77a5c561934e089";
            ReflectionTempte.LoadAssemAndShowPublicTypes(dataAssembly);
  }

 public static void LoadAssemAndShowPublicTypes(string assemId)
        {
            Assembly a = Assembly.Load(assemId);
            //循环显示已加载程序集中的每个公开类型  导出Type的全名
            foreach (Type t in a.ExportedTypes)
            {
                //显示全名
                Console.WriteLine(t.FullName);
            } 
        }

 

转载于:https://www.cnblogs.com/dragon-L/p/5384649.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值