zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Knockout应用开发指南 第八章:简单应用举例(2)
    微软ASP.NET站点部署指南(7):生产环境部署
    Knockout应用开发指南 第七章:Mapping插件
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(6)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(5)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(3)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(9)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(8)
    Microsoft Visual Studio .NET 2003 引导程序插件下载地址(非官方)
    Vs2010在没有安装SQL Server 2005/2008 Express时如何连接MDF数据文件?
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/4343696.html
Copyright © 2011-2022 走看看