鲜为人知的 “Load Context”

/*
 * 由SharpDevelop创建。
 * 用户: Changweihua
 * 日期: 2013/11/5
 * 时间: 22:15
 *
 * changweihua@outlook.com
 * http://www.cmono.net
 *
 */
using System;
 /*
  * Assembly 会被加载到三个 Load Context 中的任意一个,或者没有在任何上下文中,这三个 Load Context 的名字叫
  *
  * Default Conext、Load-From Context 和 Reflection-Only Context,另外一个没有任何上下文,叫 No Context
  *
  * 每一个 Load Context 都有自己加载依赖程序集的规则,在解释每个 Load Context 解析依赖的规则之前,先看一下 CLR 的探测过程
  *
  *
  *
  *
  *
  *
  * */
namespace LoadContextSample
{
    class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(Type.GetType("Library1.MyClass, Library1").ToString());
            //文化中立程序集的探测优先级
            /*
             * BaseDirectory\Library1.dll
             * BaseDirectory\Library1\Library1.dll
             * BaseDirectory\Library1.exe
             * BaseDirectory\Library1\Library1.exe
             * */
               
            //文化相关程序集的探测优先级
            /*
             * BaseDirectory\zn-CN\Library1.dll
             * BaseDirectory\Library1\zn-CN\Library1.dll
             * BaseDirectory\zn-CN\Library1.exe
             * BaseDirectory\Library1\zn-CN\Library1.exe
             * */
               
            //使用 probing 指定 privatePath,pirvatePath 只能定义为 BaseDirectory 的子目录。
            //也可以使用 codeBase 配置元素来指定探测的子目录
            /**
             *  <runtime>
             *      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
             *          <probing privatePath="X" />
             *      </assemblyBinding>
             *  </runtime>
             *
             * */
               
            /*
             * BaseDirectory\Library1.dll
             * BaseDirectory\Library1\Library1.dll
             * BaseDirectory\X\Library1.dll
             * BaseDirectory\X\Library1\Library1.dll
             * BaseDirectory\Library1.exe
             * BaseDirectory\Library1\Library1.exe
             * BaseDirectory\X\Library1.exe
             * BaseDirectory\X\Library1\Library1.exe
             * */
               
            //强签名程序集会先探测 GAC,如果在 GAC 中没有找到,就按照弱签名程序集的探测过程执行探测。
            //注:在探测之前 CLR 会根据应用程序配置文件、发布者策略文件和全局配置文件中的配置获取重定向后的版本,然后使用这个重定向后的版本执行探测。
            //注:强签名程序集的 codeBase 可以指定任意目录(包括 Web 地址)。
               
            //使用探测过程加载的程序集都会加载在 Default Context 中,Default Context 中的程序集具备如下特点:
            //依赖的程序集会使用探测过程被自动加载到 DefaultContext。
            //只包含探测过程可以探测到的程序集。
            //其它 Load Context 加载的程序集对于探测过程是不可用的。
               
            //使用 Assembly.LoadFrom 或 Assembly.Load 的某些重载方法加载的程序集时,如果参数使用了基于路径的形式,而非基于标识的形式,那么加载的程序集会加载在 Load-From Context 中。
            //如果 Load-From Context 中已经包含了要加载的程序集(标识相同),就不会加载两次,即使两次加载的路径不同
            //Load-From Context 中的程序集对于探测过程是不可用的
            //Load-From Context 和 Default Context(或者其它Context)都可以同时加载相同标识的程序集,但是程序集内的类型已经不是相同的类型了(虽然内容一样 )
            //依赖的程序集会自动加载,可以从 Default Context 加载,也可以从 Load-Form Context 维护的 Path 下加载
               
               
            //通过 Assembly.LoadFile 或 Assembly.Load(byte[]) 形式加载的程序集会加载在 No Context 中
            //依赖的程序集会自动加载,只会从 Default Context 加载,可以监听这个事件:AppDomain.CurrentDomain.AssemblyResolve,在事件监听器里手工加载其它依赖
            //只要路径不同,会返回多个相同程序集标识的程序集实例
               
            Console.ReadKey(true);
        }
    }
}


知识共享许可协议
《鲜为人知的 “Load Context”》常伟华 创作。
采用 知识共享 署名-相同方式共享 3.0 中国大陆 许可协议进行许可。
  • 多说评论
  • 签名
  • 新浪微博
  • 默认评论
  • Tab Header 5

0 条评论 / 点击此处发表评论

Tab Content 5

开发技术


开发平台和工具

sitemap     169.35ms