#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 发现类型的接口

Clr Via C#读书笔记---程序集的加载和反射的更多相关文章

  1. 【C#】解析C#程序集的加载和反射

    目录结构: contents structure [+] 程序集 程序集的加载 发现程序集中的类型 反射对类型成员的常规操作 发现类型的成员 创建类型的实例 绑定句柄减少进程的内存消耗 解析自定义特性 ...

  2. .net 程序集的加载与反射

    一. 程序集的加载: 在CLR内部使用System.Reflection.Assembly类的静态LoadFrom方法尝试加载程序集. LoadFrom方法在内部调用Assembly的Load方法,将 ...

  3. clr via c# 程序集加载和反射(2)

    查看,clr via c# 程序集加载和反射(1) 8,发现类型的成员: 字段,构造器,方法,属性,事件,嵌套类型都可以作为类型成员.其包含在抽象类MemberInfo中,封装了所有类型都有的一组属性 ...

  4. clr via c# 程序集加载和反射集(一)

    1,程序集加载---弱的程序集可以加载强签名的程序集,但是不可相反.否则引用会报错!(但是,反射是没问题的) //获取当前类的Assembly Assembly.GetEntryAssembly() ...

  5. thinkphp学习笔记9—自动加载

    原文:thinkphp学习笔记9-自动加载 1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\ ...

  6. .net加载失败的程序集重新加载

    在.net程序中,程序集是Lazy加载的,只有在用的时候才会去加载,当程序集加载失败时,会触发AppDomain.AssemblyResolve的事件,在这个事件中,我们甚至还可以进行补救,从别得地方 ...

  7. 显示名为“xxx.XmlSerializers”的程序集未能加载到 ID 为 1 的 AppDomain 的“LoadFrom”绑定上下文中。

    VS调试程序运行中提示“显示名为“xxx.XmlSerializers”的程序集未能加载到 ID 为 1 的 AppDomain 的“LoadFrom”绑定上下文中.错误的原因为: System.IO ...

  8. Clr Via C#读书笔记---CLR寄宿和应用程序域

    #1 CLR寄宿: 开发CLR时,Microsoft实际是将他实现成包含在一个dll中的COM服务器.Microsoft为CLR定义了一个标准的COM接口,并为该接口和COM服务器分配了GUID.安装 ...

  9. CLR via C#读书笔记一:CLR的执行模型

    CLR(Common Language Runtime)公共语言进行时是一个可由多种编程语言使用的“进行时”. 将源代码编译成托管模块 可用支持CLR的任何语言创建源代码文件,然后用对应的编译器检查语 ...

随机推荐

  1. unity3d教程游戏包含的一切文件导入资源

    http://www.58player.com/blog-2327-954.html 导入资源 将文件增加至工程文件夹的资源 (Assets) 文件夹后,Unity 将自动检测文件.将任何资源 (As ...

  2. linux中diff命令用法

    diff 命 令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版 本的diff还支持二进制文件.diff程 ...

  3. Linux中的动态库和静态库(.a/.la/.so/.o)

    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...

  4. 把ZenCart在线商店搭建到本地

    前些日子,要给在线的zencart商店做一些小改动,需要安装一个插件.大家都知道,zencart有很多插件选用,兼容性也好坏不一,直接在正在运营的网站程序上修改,难免会影响到客户体验,出什么差错了代价 ...

  5. hdu1536&&hdu3023 SG函数模板及其运用

    S-Nim Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status ...

  6. 9.4---集合子集(CC150)

    这题非常复杂.牛客网上对应的题目对结果要求比较苛刻,所以要调整. 整体思路是:先放进去一个,然后第二个来的时候插入到已有的,并且把自己也放进去. public static ArrayList< ...

  7. nginx 免安装包

    在一个环境下编译安装好nginx,然后可以拷贝到其他环境使用.同时避免直接安装造成的环境冲突. 首先下载好nginx和相关插件.然后编译安装到沙盒里面.demo如下: cd到nginx目录 ./con ...

  8. ubuntu 下mongodb安装

    1.下载: mongodb.org/download 2. 将下载的压缩文件加压到/usr/lib下 3. 建立软链接 ln -s /usr/lib/mongodb-linux-i686-2.6.7/ ...

  9. 【GoLang】golang垃圾回收 & 性能调优

    golang垃圾回收 & 性能调优 参考资料: 如何监控 golang 程序的垃圾回收_Go语言_第七城市 golang的垃圾回收(GC)机制 - 两只羊的博客 - 博客频道 - CSDN.N ...

  10. 图形化的Git

    原文:http://gitbook.liuhui998.com/6_5.html Git有不少图形化界面工具用于读取和维护仓库. 捆绑的GUI Git自带了两个使用Tcl/Tk写成的GUI程序. Gi ...