CLR查找和加载程序集的方式

没有做强名称签名的程序集

对于这种情况,CLR查找和加载程序集的方式如下

  1. 程序的根目录
  2. 根目录下面,与被引用程序集同名的子目录
  3. 根目录下面被明确定义为私有目录的子目录

同时,这种情况下,如果有定义codebase,则codebase的优先级最高,而且如果codebase指定的路径找不到,则直接报告错误,不再查找其他目录

有做强名称签名的程序集

对于这种情况,CLR查找和加载程序集的方式如下

  1. 全局程序集缓存
  2. 如果有定义codebase,则以codebase定义为准,如果codebase指定的路径找不到,则直接报告错误
  3. 程序的根目录
  4. 根目录下面,与被引用程序集同名的子目录
  5. 根目录下面被明确定义为私有目录的子目录

直接将 DLL 文件放置在输出目录

不想将 DLL 在应用程序的根目录

直接在应用程序根目录下面建立一个与程序集同名的子目录,然后将程序集放进去

很多程序集,希望统一放在一个目录

通过如下的方式,定义一个特殊的私有路径(PrivatePath)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="libs"></probing>
    </assemblyBinding>
  </runtime>
</configuration>

这也就是说,对于没有签名的程序集,CLR一般会按照如下的规则查找和加载程序集

  1. 程序的根目录
  2. 根目录下面,与被引用程序集同名的子目录
  3. 根目录下面被明确定义为私有目录的子目录

codebase的设置是优先的,而且是排他的

codebase是一个特殊的设置,我们可以在配置文件中明确地指定某个程序集的查找路径,这个规则具有最高的优先级,而且如果你做了设置,CLR就一定会按照你的设置去查找,如果找不到,它就报告失败,而不会继续查找其他路径。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="libs"/>

      <dependentAssembly>
        <assemblyIdentity name="MyLibrary"
                          culture="neutral" />
        <codeBase version="1.0.0.0"
                  href="CodeBase\MyLibrary.dll" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

程序集具有强名称签名

对程序集进行强名称签名的好处是,可以将其添加到全局全局程序集缓存中。这样既可以实现程序集的共享,又可以从一定程度上提高性能。

需要注意的是,如果程序集是经过了强名称签名,则在定义codebase的时候,应该注明publicKeyToken

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="libs"/>

      <dependentAssembly>
        <assemblyIdentity name="MyLibrary"
                          publicKeyToken="4a77fca346941a6c"
                          culture="neutral" />
        <codeBase version="1.0.0.0"
                  href="CodeBase\MyLibrary.dll" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

知识共享许可协议
《CLR查找和加载程序集的方式》 常伟华 创作。
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议 | 3.0 中国大陆许可协议进行许可。

站内公告