zoukankan      html  css  js  c++  java
  • c#程序集加载方法

    一、隐式加载
            没有被显式加载但被引用的程序集,CLR会按照全局程序集缓存(GAC)、工作目录(应用程序所在目录)以及私有路径目录的顺序来寻找并加载。

    二、AppDomain.Load 方法
        将一个程序集加载到一个特定的程序域中,主要用来供非托管代码调用

    三、Assembly.Load方法
        通过接受一个程序集标识来加载程序集。如果是强命名程序集,则标识包括程序集名称、版本、语言文化、以及公有密钥标记,Load方法将导致CLR按照隐式加载的策略寻找并加载程序集。弱命名程序集则只是一个不带文件扩展名的程序集的名称,CLR不会到GAC中查找,如果没有指定私有目录,则在工作目录查找,如Assembly.Load("Math")。其中私有目录的定义可以在配置文件中指定。如应用程序MyApp.exe的配置文件可以定义为MyApp.exe.config。内容:
        

    1.  <?xml version="1.0" encoding="utf-8" ?>
    2.     <configuration>
    3.        <runtime>
    4.           <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    5.              <probing privatePath="App;App1;" />
    6.           </assemblyBinding>
    7.        </runtime>
    8.     </configuration>

      

         其中App和App1是两个在工作目录下的目录,用probing定义,存放需要在这个目录下被加载的程序集。如果使用工作目录以外的目录下的程序集,则可以使用codeBase元素来定义,可以在MSDN上查找其属性内容。

    四、Assembly.LoadFrom方法
        参数是包括程序集清单的文件的名称或路径,包括文件扩展名。如需要加载D:\App\math.dll,可以使用语句:
        Assembly a = Assembly.LoadFrom(@"D:\App\math.dll");
        a即是加载的程序集。
        但这种方法有缺点,在MSDN上有详细的描述,我自己遇到的一个问题是加载一个在非工作目录下的程序集后,在另一个程序集中使用这个程序集中的对象进行反序列化时失败。使用Assembly.Load方法或者将该程序集放在工作目录下后问题得以解决。

    五、Assembly.LoadFile方法
        用来加载指定路径上的程序集文件的内容。使用 LoadFile 方法来加载和检查具有相同标识但位于不同路径中的程序集。与 LoadFrom 不同,LoadFile 不会将文件加载到 LoadFrom 上下文中,也不会使用加载路径解析依赖项。LoadFile 在这个受限制的方案中很有用,因为 LoadFrom 不能用于加载标识相同但路径不同的程序集;它只加载第一个这样的程序集。

    六、Assembly.LoadWithPartialName方法
        使用部分名称从应用程序目录或从全局程序集缓存加载程序集。参数为程序集标识,其中包含程序集的名称(不带文件扩展名)。程序集的版本、语言文化及公用密钥标记为可选。该方法执行时CLR首先检查应用程序的XML配置文件来搜索qualifyAssembly元素,若存在则该元素应能告诉CLR如何将一个部分的程序集标识映射为完全限定的标识,CRL将根据通常规则来查找程序集。若该元素不存在,CRL将使用指定名称在应用程序的工作目录和私有路径目录中搜索。若仍未找到,则到GAC中查找。

    七、传统VC动态库的调用
        通过 P/Invoke 调用Win32 DLL

        using System.Runtime.InteropServices;//这是用到DllImport时候要引入的程序集

        [DllImport("DBAccess.dll",CharSet=CharSet.Auto)]
        static extern ulong FindApp( bool bIsTrue );
        //声明外部的标准动态库,跟Win32API是一样的.

    文章出处:http://blog.csdn.net/podded/archive/2008/10/27/3158687.aspx

  • 相关阅读:
    Java 8 Lambda 表达式
    OSGi 系列(十二)之 Http Service
    OSGi 系列(十三)之 Configuration Admin Service
    OSGi 系列(十四)之 Event Admin Service
    OSGi 系列(十六)之 JDBC Service
    OSGi 系列(十)之 Blueprint
    OSGi 系列(七)之服务的监听、跟踪、声明等
    OSGi 系列(六)之服务的使用
    OSGi 系列(三)之 bundle 事件监听
    OSGi 系列(三)之 bundle 详解
  • 原文地址:https://www.cnblogs.com/ssqjd/p/1401779.html
Copyright © 2011-2022 走看看