【C#進階系列】03 配置文件管理與程式集的引用版本重定向

来源:http://www.cnblogs.com/vvjiang/archive/2016/03/01/5233363.html
-Advertisement-
Play Games

先來點與標題不相關的: CLR支持兩種程式集:弱命名程式集和強命名程式集。 兩者的區別在於強命名程式集使用發佈者的公鑰和私鑰進行簽名。由於程式集被唯一性地標識,所以當應用程式綁定到強命名程式集時,CLR可以應用一些已知安全的策略。 程式集可以採用兩種方式部署:私有或者全局。弱命名程式集只能以私有方式


先來點與標題不相關的:

CLR支持兩種程式集:弱命名程式集和強命名程式集。

兩者的區別在於強命名程式集使用發佈者的公鑰和私鑰進行簽名。由於程式集被唯一性地標識,所以當應用程式綁定到強命名程式集時,CLR可以應用一些已知安全的策略。

程式集可以採用兩種方式部署:私有或者全局。弱命名程式集只能以私有方式部署。

在《CLR via C#》的第三章主要講了私有部署和全局部署的具體內容,以及弱命名程式集和強命名程式集。

但是老實說一般情況下確實用不到這些東西,所以這裡就不寫了。

還有一個就是對CLR如何解析類型引用的講解,其實也簡單,在前面也略微提到了點,所以也不講了。

好了,接下來看看我認為本章有用的知識點,也就是標題的內容:

配置文件管理

所謂配置文件,就是管理我們程式里那個.config尾碼的文件。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="AuxFiles;bin\subdir"/>
      <dependentAssembly>
        <assemblyIdentity name="JeffTypes" publicKeyToken="32ab4ba45e0a69a1" culture="neutral"/>
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
        <codeBase version="2.0.0.0" href="http://www.wintellect.com/JeffTypes.dll"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="TypeLib" publicKeyToken="1f2e74e897abbcfe" culture="neutral"/>
        <bindingRedirect oldVersion="3.0.0.0-3.5.0.0" newVersion="4.0.0.0"/>
        <publisherPolicy apply="no"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

 這個XML文件為CLR提供了豐富的信息。其中包括:

  • probing元素  查找一個弱命名程式集時,檢查應用程式基目錄的AuxFiles和bin\subdir子目錄。對於強命名程式集,CLR會檢查GAC或者codeBase元素指定的URL。只有在未指定codeBase元素的前提下,CLR才會在應用程式的私有路徑中檢查強命名程式集。
  • 第一個dependentAssembly,assemlyIdentity和bindingRedirect元素  查找由控制著公鑰標記32ab4ba45e0a69a1的那個組織發佈的、語言文化中性的JeffTypes程式集的1.0.0.0版本時,改為定位同一個程式集的2.0.0.0版本。
  • codeBase元素  查找由控制著公鑰標記32ab4ba45e0a69a1的組織發佈的、語言文化為中性的JeffTypes程式集的2.0.0.0版本時,嘗試在以下URL處發現它:http://www.Wintellect.com/JeffTypes.dll。雖然第2章沒有特別指出,但codeBase元素也能用於弱命名程式集。在這種情況下,程式集的版本號會被忽略,而且根本就不應該在XML codeBase元素中寫這個版本號。此外,codeBase所定義的URL必須引用應用程式基目錄下的一個子目錄。
  • 第2個dependentAssembly,assemblyIdentity和bindingRedirect元素  查找由控制著公鑰標記1f2e74e897abbcfe的那個組織發佈的、語言文化中性的TypeLib程式集的3.0.0.0到3.5.0.0版本時(包括3.0.0.0和3.5.0.0在內),改為定位同一個程式集的4.0.0.0版本。
  • publisherPolicy元素  如果生成TypeLib程式集的組織部署了一個發佈者策略文件,CLR應該忽略該文件。

以上這塊代碼和描述完全跟書上一模一樣。

CLR會在編譯方法時,判斷它引用了哪些類型和成員,然後查找進行引用的程式集中的AssemblyRef元數據引用表,判斷程式集引用了哪些程式集,然後檢查配置文件,進行指定的版本號重定向工作。(也就是dependentAssembly,assemlyIdentity和bindingRedirect元素所做的操作)。

CLR到此時知道了真正需要載入的程式集版本,會向GAC載入(你可以理解為在我們各自電腦中一個共用的程式集的文件夾)。如果執行最後一次重定向操作的配置文件同時包含codeBase中,那麼檢查codeBase元素,CLR從指定URL載入程式集,否則就會在應用程式根目錄中查找,找不到就在根目錄下,由配置文件probing指定的目錄:即文中的AuxFiles和bin\subdir子目錄中查找。首先會查找dll文件,找不到dll文件會將尾碼名改為exe再按照規則查找。

如果在配置文件中刪除bindingRedirect元素,那麼應用程式就會恢復如初。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 回到目錄 我為什麼會來 在傳統的大型系統設計中,資料庫建模是個比開發更早的環節,先有資料庫,然後是ORM模型,最後才是開發程式,而這種模型在EF出現後發生了轉變,而且有可能將來會被code first取代,因為你的關係型資料庫沒有必要定死,你在部署網站時,沒人願意先建立一大堆SQL語句,誰都願意在I
  • 今天我們要談的原則有七大原則,即:單一職責,里氏替換,迪米特法則,依賴倒轉,介面隔離,合成/聚合原則,開放-封閉 。 1. 開閉原則(Open-Closed Principle, OCP) 定義:軟體實體應當對擴展開放,對修改關閉。這句話說得有點專業,更通俗一點講,也就是:軟體系統中包含的各種組件,
  • 各位好 : ) 最近筆者在嘗試改用ASP.NET Identity做為新系統的認證方式,發現到網路上給的資訊,不是很完整,所以做為一個工程屍,為了避免大家遇到一樣的問題。特地將一些有趣的地方記錄下來 首先如果你是舊的專案,想要用ASP.NET Identity ,你必需要利用NuGet安裝以下幾個套
  • 今天在部署ASP.NET網頁時出現一個奇怪的問題。在開發,調試時訪問網頁一切正常。但一部署到IIS中時就會出現以下的錯誤信息:'InitializeCulture' is not a member of 'XXXX'. 解決方法:1,在publish時,將第一個選項Allows this preco
  • 1.網路下載文件 1 URL url = new URL(strUrl); 2 3 HttpURLConnection httpconn = (HttpURLConnection)url.openConnection(); 4 5 httpconn.getContentLength(); 2.本地文
  • Web How to do distributed locking Writing Next Generation Reusable JavaScript Modules in ECMAScript 6 Essential Tools for Building SPAs with AngularJS...
  • dataGrid 其實就是一個HTML TABLE 想清楚這個以後,要設置多維表頭就好辦了 HTML代碼 <asp:DataGrid ID="DataGrid1" runat="server" onitemdatabound="DataGrid1_ItemDataBound"> </asp:Data
  • 1、為服務創建安裝程式 1)、返回到 Service1 的“設計”視圖。 2)、單擊設計器的背景以選擇服務本身,而不是它的任何內容。 3)、在“屬性”視窗中,單擊屬性列表下麵灰色區域中的“添加安裝程式”鏈接。 預設情況下,向您的項目添加包含兩個安裝程式的組件類。將該組件命名為ProjectInsta
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...