步驟 1:檢查組態檔
組件繫結行為可以根據三個 XML 檔案,在不同的層級上設定:
應用程式組態檔
發行者原則檔
電腦組態檔
這些檔案遵循相同語法,並且提供資訊,例如繫結的重新導向、程式碼的位置和特定組件的繫結模式。 各個組態檔都可以包含重新導向繫結處理序的 <assemblyBinding> 項目。 <assemblyBinding> 項目的子項目包括 <dependentAssembly> 項目。 <dependentAssembly> 項目的子項目包括 <assemblyIdentity> 項目、<bindingRedirect> 項目和 <codeBase> 項目。
注意事項 |
---|
組態資訊可以在三個組態檔中找到;並不是所有的項目在所有組態檔中都有效。例如,繫結模式和私用路徑資訊只能在應用程式組態檔中。如需各檔案所包含之資訊的完整清單,請參閱設定應用程式。 |
應用程式組態檔
首先,Common Language Runtime 會檢查應用程式組態檔,看是否有覆寫儲存於呼叫組件之資訊清單中的資訊。 應用程式組態檔可以和應用程式一起部署,但對應用程式的執行則不是必要的。 通常這個檔案的擷取幾乎是瞬間的,在應用程式基底位於遠端電腦的場合,例如在 Internet Explorer Web 架構的案例中,組態檔必須被下載。
對用戶端可執行檔而言,應用程式組態檔所在目錄和應用程式可執行檔一樣,並且其基底名稱和 .config 副檔名之可執行檔相同。 例如,C:\Program Files\Myapp\Myapp.exe 的組態檔是 C:\Program Files\Myapp\Myapp.exe.config。 在以瀏覽器為主的案例中,HTML 檔必須使用 <link> 項目來明確指向該組態檔。
下列程式碼提供應用程式組態檔的簡單範例。 這個範例會將 TextWriterTraceListener 加入至 Listeners 集合,以便使偵錯資訊記錄至檔案。
<configuration>
<system.diagnostics>
<trace useGlobalLock="false" autoflush="true" indentsize="0">
<listeners>
<add name="myListener" type="System.Diagnostics.TextWriterTraceListener, system version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" initializeData="c:\myListener.log" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
發行者原則檔
第二,只要有一個發行者原則檔存在,執行階段就會進行檢查。 發行者原則檔會由元件發行者以共用元件的修正或更新形式來散發。 這些檔案包含由共用元件的發行者核發的相容資訊,以導向組件參考至新版本。 不像應用程式和電腦組態檔,發行者原則檔被包含在它們自己必須安裝於全域組件快取的組件中。
下列是發行者原則組態檔的範例:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="asm6" publicKeyToken="c0305c36380ba429" />
<bindingRedirect oldVersion="3.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
若要建立組件,您可以使用Al.exe (組件連結器) 工具搭配下列命令:
Al.exe /link:asm6.exe.config /out:policy.3.0.asm6.dll /keyfile: compatkey.dat /v:3.0.0.0
compatkey.dat 是強式名稱 (Strong Name) 金鑰檔。 此命令會建立可以放置到全域組件快取的強式名稱組件。
注意事項 |
---|
發行者原則會影響所有使用共用元件的應用程式。 |
發行者原則組態檔覆寫來自應用程式 (亦即,從組件資訊清單或從應用程式組態檔) 的版本資訊。 如果應用程式組態檔中沒有陳述式來重新導向組件資訊清單中指定的版本,發行者原則檔會覆寫組件資訊清單中指定的版本。 然而,如果應用程式組態檔中有重新導向的陳述式,發行者原則會覆寫那個版本,而非資訊清單中指定的版本。
當共用元件更新而共用元件的新版本應該被所有用到該元件的應用程式取得時,發行者原則檔會被使用。 除非應用程式組態檔強制使用安全模式,否則發行者原則檔中的設定值會覆寫應用程式組態檔的設定值。
安全模式
發行者原則檔通常明確安裝為 Service Pack 或程式更新的一部分。 如果升級的共用元件有任何問題,您可以使用安全模式來略過發行者原則檔中的覆寫。 決定安全模式的項目為 <publisherPolicy apply="yes | no"/>,該項目只能夠在應用程式組態檔中找到。 它指定發行者原則組態資訊是否要從繫結程序中移除。
安全模式可以針對整個應用程式或針對選取的組件來設定。 也就是,您可以關閉構成應用程式之所有組件的原則,或開啟其中某些組件的原則。 若要選擇性套用發行者原則於構成應用程式的組件,請設定 <publisherPolicy apply=no/>,並使用 <dependentAssembly> 項目來指定您想要它們受影響的那些組件。 若要套用發行者原則至構成應用程式的所有組件,請使用沒有相依組件項目來設定 <publisherPolicy apply=no/>。 如需組態的詳細資訊,請參閱組態檔。
電腦組態檔
第三,Runtime 會檢查電腦組態檔。 這個檔案,稱為 Machine.config,位在本機電腦執行階段安裝所在之根目錄的 Config 子目錄下。 這個檔案可以被系統管理員用來指定屬於那個電腦本機的組件繫結限制。 電腦組態檔中的設定值優先於所有其他組態設定;然而,這並不意謂所有組態設定應該放在這個檔案。 由系統管理員原則檔決定的版本是確定的,而且不能被覆寫。 Machine.config 檔案中指定的覆寫會影響所有應用程式。 如需組態檔的詳細資訊,請參閱組態檔。