.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);
}
}
.net 程序集的加载与反射的更多相关文章
- 【C#】解析C#程序集的加载和反射
目录结构: contents structure [+] 程序集 程序集的加载 发现程序集中的类型 反射对类型成员的常规操作 发现类型的成员 创建类型的实例 绑定句柄减少进程的内存消耗 解析自定义特性 ...
- Clr Via C#读书笔记---程序集的加载和反射
#1 加载程序集 Assembly.Load: public class Assembly { public static Assembly Load(AssemblyName assemblyRef ...
- clr via c# 程序集加载和反射(2)
查看,clr via c# 程序集加载和反射(1) 8,发现类型的成员: 字段,构造器,方法,属性,事件,嵌套类型都可以作为类型成员.其包含在抽象类MemberInfo中,封装了所有类型都有的一组属性 ...
- clr via c# 程序集加载和反射集(一)
1,程序集加载---弱的程序集可以加载强签名的程序集,但是不可相反.否则引用会报错!(但是,反射是没问题的) //获取当前类的Assembly Assembly.GetEntryAssembly() ...
- .net加载失败的程序集重新加载
在.net程序中,程序集是Lazy加载的,只有在用的时候才会去加载,当程序集加载失败时,会触发AppDomain.AssemblyResolve的事件,在这个事件中,我们甚至还可以进行补救,从别得地方 ...
- 显示名为“xxx.XmlSerializers”的程序集未能加载到 ID 为 1 的 AppDomain 的“LoadFrom”绑定上下文中。
VS调试程序运行中提示“显示名为“xxx.XmlSerializers”的程序集未能加载到 ID 为 1 的 AppDomain 的“LoadFrom”绑定上下文中.错误的原因为: System.IO ...
- 【C#进阶系列】23 程序集加载和反射
程序集加载 程序集加载,CLR使用System.Reflection.Assembly.Load静态方法,当然这个方法我们自己也可以显式调用. 还有一个Assembly.LoadFrom方法加载指定路 ...
- 重温CLR(十七)程序集加载和反射
本章主要讨论在编译时对一个类型一无所知的情况下,如何在运行时发现类型的信息.创建类型的实例以及访问类型的成员.可利用本章讲述的内容创建动态可扩展应用程序. 反射使用的典型场景一般是由一家公司创建宿主应 ...
- 类的加载到反射reflect
类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载.连接.初始化这三个步骤来实现对这个类进行初始化. 加载: 就是指将class文件加载进入内存,并为之创建一个Class对 ...
随机推荐
- CentOS7.6安装Maven
官网下载地址:http://maven.apache.org/download.cgi 第一步:软件下载安装 进行安装目录:cd /opt/software (如果目录不存在,请先创建目录) 下载二进 ...
- django的实现异步机制celery
celery 一句话总结:celery是一种实现异步的机制,对于比较耗时的任务可以使用其来减少客户端等待时间(注册邮箱验证),提高用户体验. 官方网站 中文文档 示例一:用户发起request,并等待 ...
- 核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程
KPCA,中文名称”核主成分分析“,是对PCA算法的非线性扩展,言外之意,PCA是线性的,其对于非线性数据往往显得无能为力,例如,不同人之间的人脸图像,肯定存在非线性关系,自己做的基于ORL数据集的实 ...
- GeoServer之sqlserver插件安装
GeoServer之sqlserver插件安装 GeoServer可以直接从sqlserver中获取数据,用来发布wms服务.但是其sqlserver连接插件并没有直接集成在Geoserver中,需要 ...
- mongodb Java(八)
package com.mongodb.text; import java.net.UnknownHostException; import com.mongodb.DB; import com.mo ...
- 双 MySQL 启动、停止脚本
5.5 启动 #!/bin/bash # author: Wang Xiaoqiang # func: Start MySQL 5.5 pid=`netstat -lnpt | awk -F '[ / ...
- sqlserver,oracle,mysql等的driver驱动,url怎么写
oracle driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@localhost:1521 ...
- ElasticSearch如何新增字段
/index/type/_mapping post { "properties": { "zy_renwu_pingjia": { "type&qu ...
- jsp出现getOutputStream() has already been called for this response异常的原因和解决方法
jsp出现getOutputStream() has already been called for this response异常的原因和解决方法 在tomcat5下jsp中出现此错误一般都是在js ...
- docker plugin test
docker build -t docker-volume-drbd . id=$(docker create docker-volume-drbd true) docker export $id - ...