《精通C#》十四章-.NET程序集入门
在書中,這一章節的開頭說的是自定義命名空間和使用命名空間,在以我目前有限的經驗來說,程序集就是一個類庫經過編譯之后,所生成的一個在引用命名空間,進而使用該文件中已經定義好的字段,屬性以及方法的文件,以.dll作為后綴名。這也是為什么在書本的開頭就是以命名空間入手。那么什么是命名空間,最直觀的方法就是去定義一個類,在類的內部你會發現,總有一個namespace關鍵字,后面還會跟隨一個字符串作為名稱,這個名稱就是命名空間的名字,也就是接下來我們所要說的程序集的名稱,我們先說說命名空間,在接下來說程序集。命名空間使用using來對不同的程序集進行引用,而且如果在使用一個命名空間的時候,由于命名空間的名稱過于冗長,每次書寫過于麻煩,就可以使用using為該方法定義一個縮略名,之后使用該命名空間是就可以直接使用該塑料名,而不需要寫全名稱。而且在一個命名空間內部我們可以再次定義一個命名空間,形成嵌套的命名空間,至于這樣的作用,有人說這樣子的代碼更安全,反正在我看來是沒什么卵用。那么,什么又是程序集呢?書上市這樣描述的:程序集就是一個以公共語言運行庫為宿主,版本化的,自描述的二進制文件。為什么說是以公共語言運行庫為宿主呢?要知道,CLR可以將代碼編譯為IL中間語言,這樣就使得我們的代碼可以跨語言進行復用,而且可以在任何支持.NET的平臺上使用,這樣就促進了代碼的重復使用。版本化就是可以給一個程序集定義不同的版本,這個有什么作用呢?這樣兩個不同版本的程序集就可以在一個文件中共存,而不會產生沖突。這時候我就會想:為什么需要兩個不同版本的程序集呢,我只要把第一個版本的內容進行修改不就可以了嗎?這樣也許會更方便,都是程序集并不是完全獨立的,它們之間有可能存在一些依賴關系,這是候,如果對舊版本的程序集不進行保留,這就可能導致一些依賴與它的程序無法正常運行,所以最好是保留不同版本的程序集,這就又要說明程序是如何制定應該使用哪個程序集的方法了, 在這之前,我們需要先講解私有程序集和共享程序集。
在我看來所謂的私有程序集就是程序在引用它的時候會自動在程序目錄或者子目錄下自動生成還程序集的副本,也就是說,程序使用的是程序集的副本,這樣在一個程序中若是多次使用該程序集的話就會產生多個副本,這就是多對多的關系,共享程序集目的和私有程序集其實是一樣的,旨在一個程序集為多個項目所使用,不同在于它因為部署在一個公共文件夾中,所以它或者說是它的副本被所有引用它的項目所共用(因為程序集部署過去時,其實是在公共文件夾中產生一個副本),當然,這里面的引用路徑就必須是該公共文件夾中的程序集的路徑了。那么這個文件夾是可以隨意一個或者是自己創建的嗎?當然不是,這個文件夾的名稱叫做全局程序集緩存(GAC),它的確切位置是有機器上所安裝的.NET平臺的版本決定的,在4.0之前,GAC就是C盤中Windows目錄下的Assembly子目錄,在在4.0之后,GAC就變成C:\windows\Microsoft.NET\assembly\GAC_MSIL,在這里要特別提示,GAC中只能將.dll文件部署為共享程序集,而且不能將可執行的程序集(.exe)安裝進去。那么該如何安裝.dll文件到GAC中呢?這就要用到安裝.net平臺之后,自帶的Tools文件夾中的的開發人員命令工具,打開命令工具,輸入gacutil /?查詢gacuti.exe的用法,主要使用到-i將強名稱的程序集安裝入GAC,使用-u從GAC中卸載程序集,使用-l顯示GAV中的程序集的相關信息,帶上程序集的友好名稱(去掉.dll后綴的名稱)就可以查詢該程序集的相關信息。在上面提到了強名稱,要注意,在部署程序集之前需要先給程序集賦予一個強名稱,那么強名稱是什么呢?簡單來說,強名稱就是用于標識給定.NET二進制文件的發行者。在.NET中的作用好比全局唯一表示符,它由一系列的相關數據組成,分別是程序集的友好名稱,版本號,公鑰,用于本地化的可選的區域性標識,嵌入的數字簽名(使用基于程序集內容的散列值和私密鑰組成)。那么強名稱有什么作用呢,為什么共享程序集強制要求只能是強名稱的程序集呢?因為強名稱的組成中有一名為散列值,這是基于程序集的內容生成的,可以說是唯一的,也就是說只要一經設置強名稱,就算有人惡意的創建一個相同名稱的程序集替換原先的那個程序集,在使用的時候經過.NET檢測器檢測出來,進而停止運行。欲要生成公私鑰就需要使用sn.exe工具生成一個文件,這個文件包含兩個不同的鑰,這個文件一般以*.snk為文件擴展名。那么該如何生成強名稱呢?大約在2003年之前,欲要生成強名稱的話只有一個方法,那就是使用命令行,還是使用Tools下的開發人員命令提示工具,使用sn生成強名稱,至于具體的方法我就不多做綴訴了,因為我們現在有更好用的方法,想要具體了解什么使用sn的自行翻書到p433頁或者在網上自行尋找。那么第二種方法又是什么呢?那就是使用vs自帶的功能為程序集添加一個強名稱,首先,右鍵點擊該類庫,選擇屬性,左邊有一欄的選項,選擇簽名,打鉤為程序集簽名,之后在選擇強名稱密鑰文件中選擇新建,推薦以類庫友好名稱作為密鑰文件名稱,記得以.snk作為結尾,至于密碼一般是不使用的,這還是看個人吧。這樣就可以創建一個強名稱的程序集,之后就可以部署入GAC中了,使用共享程序集的方法和一般的程序集是一樣的,但是在引用的時候要在瀏覽中打開GAC文件夾,選中所要引用的程序集,之后一切如同往常一樣使用。
現在我們說說該操作才能使得程序正確指向我器所需要的程序集的版本,例:
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0"/>
</dependentAssembly>
這個例子是我直接從web.config中摳出來的,在<dependentAssembly>元素里面創建<assemblyIdentity>子元素,它用于指定列在客戶清單中的程序集的友好名稱和一個可選區域(culture)特性,若是要使用默認的區域設置,只需要把這個特性設置為空或者忽略。另外還需要<bindingRedirect>用它來定義程序清單當前指向的版本(oldVersion表示)和GAC中替代的版本(newVersion表示)。但是如果程序是一個桌面引用程序的時候,那就需要在程序中先創建一個App.config,記住,名稱必須是App,程序編譯之后在bin\debug中會有一個已*.exe.config作為后綴的文件,屆時把以上的內容保存進去就是了。但是這樣寫又會在修改版本的時候會有很大的麻煩,因為我需要將config文件的修改內容一個個的發布過去(客戶端程序),這樣的工作量很大,這就有了發行者策略程序集,作用是運行程序集的發行者在部署程序集的同時,把一個*.config文件的二進制版本也安裝到GAC,這樣在客戶端應用程序那邊就不需要包含config文件了,我們使用al.exe工具在命令行創建發行者策略程序集,還需要以下幾個參數:1.含有重定向指令的config文件或者xml文件的位置。2.生成的發行者策略程序集的名稱,不能僅僅寫一個名稱,同時需要將發行者程序集輸出之后將在哪個文件夾保存的地址。3.用于對發行者策略程序集簽名的.snk文件的位置。4.創建的發行者策略程序集的版本號。它是這樣的一個字符串:主版本號.次版本號.程序集名.dll,在輸出發行者程序集之后,再按照發布全局程序集的方式發布一次就可以了。但是需要記住的是,在發布發行者策略程序集之前,需先將最新的程序集發布至GAC。在書中的這一章節還有一個<codeBase>元素用于指示CLR探測位于網絡終點或者客戶端應用程序目錄以外的本地目錄的依賴程序集。當其指向遠程計算機的時候,相關具有強名稱的程序集會被下載GAC的下載緩存中。但是若是目錄是相對于客戶端應用程序時,是可以拿來探測不具有強名稱的程序集的。
總結
以上是生活随笔為你收集整理的《精通C#》十四章-.NET程序集入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS_mapKit与Core Loca
- 下一篇: 碳水化合物是什么东西?