• Assembly中Load, LoadFrom, LoadFile以及AppDomain, Activator类中相应函数的区别


    Assembly和AppDomain的一些关于动态加载程序集的函数有些令人头疼,但细细研究后还是可以将他们区分的。 这些函数大致可以分为四类: 

    第一类:加载到Load Context内

    Load Context:

    • Load Context是所有动态加载程序集首选应该被加载到的地方。
    • 它只能加载在AppDomain信息中的ApplicationBase目录以及附带的PrivateBinPath目录内的程序集(关于这两个目录:可以参考另一篇文章:http://www.cnblogs.com/mgen/archive/2011/05/02/2034371.html

     

    执行这个操作的方法是:

        Assembly.Load(AssemblyName)

        Assembly.Load(string  程序集名称) 

    注意上面的字符串参数是程序集名称,而不是路径,程序集名称可以直接是简写的程序集名称,或是完整的名称比如(SampleAssembly, Version=1.0.2004.0, Culture=neutral, PublicKeyToken=8744b20f8da049e3)(不带括号)

     

    间接调用上面方法的其他方法有:

    AppDomain类

        Load(AssemblyName)

        Load(string 程序集名称)

        ExecuteAssemblyByName(string 程序集名称)

        CreateInstance(...)

     

    Activator类

        CreateInstance(...)

     

     进行一个小测试

                string assName = "mbody";

                //这是程序集名称,不是路径

                string pLocal = Path.Combine(Environment.CurrentDirectory, "mbody.dll");

                //这是路径

                var load = Assembly.Load(assName);

                //用程序集名称加载

                var load2 = Assembly.Load(new AssemblyName() { CodeBase = pLocal });

                //用路径

                Console.WriteLine(load == load2); //True

     

     

     

    第二类:加载到LoadFrom Context内

    LoadFrom Context

    • 主要用来加载不在ApplicationBase目录以及附带的PrivateBinPath目录内的程序集
    • 不可以指定程序集版本或其他信息
    • 如果在LoadFrom Context中已经有一个具有相同程序集名称的程序集(即使实际程序集路径不一样),LoadFrom仍然会返回已经加载的程序集

     

    执行这个操作的方法是:

    Assembly.LoadFrom(string 程序集文件路径, ...)

    这里的字符串参数是文件路径。

     

    间接调用上面方法的其他方法有:

    AppDomain类

        CreateInstanceFrom(string 程序集文件路径, ...)

     

    Activator类

        CreateInstanceFrom(string 程序集文件路径, ...)

     

     

    小测试

                //这几个文件都是同一个程序集

                string pLocal = Path.Combine(Environment.CurrentDirectory, "mbody.dll");

                var load = Assembly.Load("mbody");

                var loadFromloc = Assembly.LoadFrom(pLocal);

                var loadFrom = Assembly.LoadFrom("c:\mbody.dll");

                var loadFrom2 = Assembly.LoadFrom("C:\mbody2.dll");

                Console.WriteLine(load == loadFromloc);

                Console.WriteLine(loadFrom == loadFrom2);

                Console.WriteLine(load == loadFrom);

                //(load == loadFromLoc) != (loadFrom == loadFrom2)

     

     

    第三类:反射Context

    反射Context

    • 这里加载的程序集不能执行,类的静态构造函数也不执行,一般用来进行反射操作。

     

    属于这一类的方法有:

    Assembly.ReflectionOnlyLoad(string  程序集名称)  (byte[])

    Assembly.ReflectionOnlyLoadFrom(string 程序集文件路径)

     

     

     

    第四类:不属于任何Context

    不属于任何Context

    • 用来加载LoadFrom无法加载的具有相同程序集名称但是路径不同的程序集
    • 可以是通过字节数组加载,也可能是Reflection.Emit生成的不在磁盘的程序集
    • 具有很多的限制

     

    属于这一类的方法有:

    Assembly.Load(byte[])

    Assembly.LoadFile(string 程序集文件路径)

     

    AppDomain.ExecuteAssembly(string 程序集文件路径, ...)

     

     

    测试 :

                //这几个文件都是同一个程序集

                string pLocal = Path.Combine(Environment.CurrentDirectory, "mbody.dll");

                var load = Assembly.Load("mbody");

                var loadFileloc = Assembly.LoadFrom(pLocal);

                var loadFile = Assembly.LoadFile("c:\mbody.dll");

                var loadFile2 = Assembly.LoadFile("C:\mbody2.dll");

                Console.WriteLine(load == loadFileloc);

                Console.WriteLine(loadFile == loadFile2);

                Console.WriteLine(load == loadFile);

                //(load == loadFromLoc) != (loadFrom != loadFrom2)

     

    更多可以参考MSDN(见备注):http://msdn.microsoft.com/zh-cn/library/1009fa28.aspx

  • 相关阅读:
    CKA-Kubernets(K8s) (一)
    CKA-docker 容器的管理
    CKA-docker 镜像的管理
    CKA-docker 基础
    开年自省系列—— 阅读完一本书《财务之路系列》 读书笔记
    Sublime开启VIM模式
    JavaScript 踩坑开始(ing...)
    代码思考题玩玩
    P2016 战略游戏-树形DP
    皇宫看守-树形DP
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/4343696.html
Copyright © 2020-2023  润新知