天天看點

一起談.NET技術,詳解.NET程式集的加載規則

  程式集的加載涉及到很多方面的知識,包括配置檔案、全局緩存裝配、私有目錄等的查找。用LoadAWithPartialName方法加載程式集,必須提供程式集的文本名稱,還可以包公鑰标記、版本或區域性等,但不必包含完全引用資訊,如名稱、版本、區域性、公鑰标記。

  使用(System.Reflection.Assembly.Load)并僅指定部分引用,運作庫在全局程式集緩存和應用程式根目錄中對程式集進行檢查。使用LoadWithPartialName方法并僅指定部分引用,運作庫在應用程式目錄中和全局程式集緩存中對程式集進行檢查。另外,提供部分引用,可在應用程式集的配置檔案中提供完全引用的資訊。

  使用Load提供部分引用程式集的查找:

  1. 在應用程式的配置檔案中檢查

  <qualifyAssembly>元素中相關的限定資訊,如果找到了,則将部分引用的限制條件轉化為新的引用限定條件。假如:

<qualifyAssembly partialName="mydll"

fullName="mydll,version=1.0.0.1,publicKeyToken=xxx,culture=zh-CN">

當發生以下調用時:Assembly a=Assembly.Load("mydll"); 則将條件轉化為更強的條件"mydll,version=1.0.0.1,publicKeyToken=xxx,culture=zh-CN".

  2. 根據指定的限定條件在全局程式集緩存中比對

  如果有一個或多個比對項,則取第一個比對的程式集,進入第4步,否則就進入第3步。

  3. 在應用程式目錄下根據更強的限定條件比對

  如果有一個或多個比對,就取第一個,進入第4步,否則局部引用失敗

  4. 如果指定了版本政策,則對比對的程式集應用版本政策

一起談.NET技術,詳解.NET程式集的加載規則

<dependentAssembly>

一起談.NET技術,詳解.NET程式集的加載規則

   <assemblyIdentity name="mydll" publicKeyToken="xxx" culture="zh-CN"></assemblyIdentity>

一起談.NET技術,詳解.NET程式集的加載規則

   <bindingRedirect oldVersion="1.3.0.0" newVersion="1.2.0.0"></bindingRedirect>

一起談.NET技術,詳解.NET程式集的加載規則

</dependentAssembly>

  根據版本政策,最後加載的是新版本"mydll,publicKeyToken=xxx,culture=zh-CN,version=1.2.0.0"。假如是LoadPartialName 則先從應用程式根目錄下比對,沒找到比對項則從全局程式集緩存中去比對...一樣也應用版本政策,比對的過程中,還要考慮到區域性文化的問題,如:

一起談.NET技術,詳解.NET程式集的加載規則

<configuration>

一起談.NET技術,詳解.NET程式集的加載規則

  <runtime>

一起談.NET技術,詳解.NET程式集的加載規則

    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

一起談.NET技術,詳解.NET程式集的加載規則

       <qualifyAssembly partialName="mydll" fullName="mydll,version=1.2.0.0,culture=zh-CN,publicKeyToken=xxx"/>

一起談.NET技術,詳解.NET程式集的加載規則

       <dependentAssembly>

一起談.NET技術,詳解.NET程式集的加載規則

          <assemblyIdentity name="mydll",publicKeyToken="xxx" culture="zh-CN"/>

一起談.NET技術,詳解.NET程式集的加載規則

       </dependentAssembly>

一起談.NET技術,詳解.NET程式集的加載規則

       <bindingRedirect oldVersion="1.2.0.0" newVersion="1.3.0.0">

一起談.NET技術,詳解.NET程式集的加載規則

    </assemblyBinding>

一起談.NET技術,詳解.NET程式集的加載規則

  </runtime>

一起談.NET技術,詳解.NET程式集的加載規則

</configuration>

  在全局程式集緩存中有:

  mydll,version="1.2.0.0",publicKeyToken=xxx,culture=zh-CN

  和

  mydll,version="1.3.0.0",publicKeyToken=xxx,culture=en-US

  在私有目錄下有:

  mydll,version="1.3.0.0",publicKeyToken=xxx,culture=zh-CN

繼續閱讀