程式集的加載涉及到很多方面的知識,包括配置檔案、全局緩存裝配、私有目錄等的查找。用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. 如果指定了版本政策,則對比對的程式集應用版本政策

<dependentAssembly>

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

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

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

<configuration>

<runtime>

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

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

<dependentAssembly>

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

</dependentAssembly>

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

</assemblyBinding>

</runtime>

</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