步驟 4:透過程式碼基底或探查找出組件
在正確組件版本已使用呼叫組件的參考和組態檔的資訊來決定之後,並且在它已經於全域組件快取中 (僅針對強式名稱組件) 檢查之後,Common Language Runtime 會嘗試尋找組件。 找出組件的過程有下列步驟:
如果在應用程式組態檔中找到 <codeBase> 項目,執行檢查會檢查指定的位置。 如果找到相符項目,表示正在使用組件而不探查。 如果組件未在那裡找到,則繫結要求失敗。
執行檢查接著使用本章節稍後會說明的規則來探查受參考的組件。
注意事項 |
---|
如果目錄中有多個不同版本的組件,而且要參考特定版本的組件,就必須使用 <codeBase> 項目,而不能使用 <probing> 項目的 privatePath 屬性。如果使用 <probing> 項目,執行檢查一找到符合所參考之簡單組件名稱的組件 (無論是否確實相符),就停止探查。如果確實相符,即使用該組件。如果並不確實相符,則停止探查,繫結失敗。 |
透過程式碼基底找出組件
程式碼基底資訊可以使用組態檔中的 <codeBase> 項目來提供。 這個程式碼基底一定要在執行階段嘗試探查受參考組件之前被檢查。 如果含有最終版本重新導向的發行者原則檔也包含有 <codeBase> 項目,該 <codeBase> 項目就是所使用的項目。 例如,如果您的應用程式組態檔指定 <codeBase> 項目,而覆寫應用程式資訊的發行者原則檔也指定 <codeBase> 項目,則使用發行者原則檔中的 <codeBase> 項目。
如果在 <codeBase> 項目指定的位置中沒有找到符合的組件,繫結要求將失敗,並且不會採取進一步的步驟。 如果執行階段確定組件符合呼叫組件的條件,它即使用那個組件。 載入由特定 <codeBase> 項目所指定的檔案時,執行檢查會進行檢查,以確定名稱、版本、文化特性和公開金鑰 (Public Key) 與呼叫組件的參考相符。
注意事項 |
---|
應用程式根目錄之外的受參考組件必須具有強式名稱,並且必須安裝於全域組件快取,或者使用 <codeBase> 項目來指定。 |
透過探查找出組件
如果在應用程式組態檔中沒有 <codeBase> 項目,執行檢查會使用四個準則來探查組件:
應用程式基底,為應用程式執行時所在的根位置。
文化特性,為參考中組件的文化特性屬性 (Attribute)。
名稱,為受參考組件的名稱。
<probing> 項目的 privatePath 屬性,是根位置下使用者定義的子目錄清單。 這個位置可以使用應用程式定義域的 AppendPrivatePath 屬性,在應用程式組態檔和 Managed 程式碼中指定。 在 Managed 程式碼中指定時,會先探查 Managed 程式碼的 privatePath,接著再探查應用程式組態檔中指定的路徑。
探查應用程式基底和文化特性目錄
執行檢查一定會在應用程式的基底中開始探查,這可能是 URL 或電腦上應用程式的根目錄。 如果受參考組件不在應用程式基底中,並且文化特性資訊沒有被提供的話,執行檢查會搜尋任何具有組件名稱的子目錄。 受探查的目錄包括:
[application base] / [assembly name].dll
[application base] / [assembly name] / [assembly name].dll
如果已指定受參考組件的文化特性資訊,則只有下列目錄會被探查:
[application base] / [culture] / [assembly name].dll
[application base] / [culture] / [assembly name] / [assembly name].dll
以 privatePath 屬性探查
除了文化特性子目錄和為參考組件命名的子目錄以外,執行檢查也會探查使用 <probing> 項目的 privatePath 屬性指定的目錄。 使用 privatePath 屬性指定的目錄必須是應用程式根目錄的子目錄。 探查的目錄依文化特性資訊是否包含在受參考組件要求之中而有所變動。
執行檢查一找到符合參考的簡單組件名稱的組件 (無論是否確實相符),就停止探查。 如果確實相符,即使用該組件。 如果並不確實相符,則停止探查,繫結失敗。
如果包含有文化特性,則探查下列目錄:
[application base] / [binpath] / [culture] / [assembly name].dll
[application base] / [binpath] / [culture] / [assembly name] / [assembly name].dll
如果不包含文化特性資訊,則探查下列目錄:
[application base] / [binpath] / [assembly name].dll
[application base] / [binpath] / [assembly name] / [assembly name].dll
探查範例
提供下列資訊:
參考的組件名稱:myAssembly
應用程式根目錄:http://www.code.microsoft.com
組態檔中的 <probing> 項目指定:bin
文化特性 (Culture):de
執行檢查探查下列 URL:
http://www.code.microsoft.com/de/myAssembly.dll
http://www.code.microsoft.com/de/myAssembly/myAssembly.dll
http://www.code.microsoft.com/bin/de/myAssembly.dll
http://www.code.microsoft.com/bin/de/myAssembly/myAssembly.dll
多個名稱相同的組件
以下範例會示範如何以相同名稱設定多個組件。
<dependentAssembly>
<assemblyIdentity name="Server" publicKeyToken="c0305c36380ba429" />
<codeBase version="1.0.0.0" href="v1/Server.dll"/>
<codeBase version="2.0.0.0" href="v2/Server.dll"/>
</dependentAssembly>
受探查的其他位置
組件位置也可以使用目前的繫結內容來決定。 這最常發生在使用 Assembly.LoadFrom 方法時,以及 COM interop 案例中。 如果組件使用 LoadFrom 方法參考另一個組件,呼叫組件的位置將視為有關尋找受參考組件之位置的提示。 如果找到符合的組件,即載入那該組件。 如果沒有找到符合的組件,執行檢查繼續進行其搜尋語意 (Semantics) 並接著請求 Windows Installer 提供組件。 如果沒有提供符合繫結要求的組件,則會擲回例外狀況。 如果有參考型別,這個例外狀況在 Managed 程式碼中是一個 TypeLoadException,或者,如果找不到載入的組件就是 FileNotFoundException。
例如,如果 Assembly1 參考 Assembly2,而 Assembly1 要從 http://www.code.microsoft.com/utils 下載,該位置即被視為何處去尋找 Assembly2.dll 的關於提示。 執行檢查接著會在 http://www.code.microsoft.com/utils/Assembly2.dll 和 http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll 中探查組件。 如果在那些位置都找不到 Assembly2,執行檢查會查詢 Windows Installer。