學習筆記《.NET框架程序設計(修訂版)》--第三章 共享程序集 (3)
2024-07-10 12:59:15
供稿:網友
3.6 延遲簽名
1、在開發和測試程序集時,允許訪問安全的私有密鑰可能會導致私鑰泄密,因而,.net框架支持一種稱作延遲簽名(delayed signing)的技術,有時也叫局部簽名(partial signing)。
延遲簽名允許我們只使用公司的公有密鑰就可以生成程序集:
a、程序集引用我們的程序集,使用公有密鑰允許它們將正確的公有密鑰嵌入到assemblyref元數據條目中;
b、公有密鑰生成的程序集還允許被放在gac的內部結構中;
c、但用公有密鑰生成的程序集因為沒有經過散列轉換也沒有在文件中嵌入數字簽名,將失去篡改保護功能。
2、實現延遲簽名:
a、將公司的公有密鑰存放在一個文件中,然后將該文件名傳遞給程序集生成工具(3.2中的2有詳細講述);
b、將下面的兩個特性加到源代碼中告訴生成工具對程序集進行延遲簽名:
[assembly:assemblykeyfile(“mycompanypublickey.keys”)]
[assembly:assemblydelysign(true)]
如果使用al.exe工具,還可以在命令行中指定 /keyf[ile]和 /delay[sign]開關來實現;
c、將程序集安裝到gac,必須通過給 sn.exe 工具指定 -vr 命令行開關阻止系統對程序集進行完整性驗證。這樣還可以使clr在運行時加載程序集的時候,跳過對其內任何文件的散列值的檢查:
sn.exe -vr myassembly.dll;
d、完成開發和測試后,打包和部署程序集時需要用sn.exe 的 -r 命令行開關使用私有密鑰對程序集進行簽名,用sn.exe的 -vu 或 -vx 命令行開關恢復對程序集的驗證過程:
sn -vu myassembly.dll
3、一些組織將它們的密鑰對保存在一個硬件設備中,一些加密服務商(csp)為抽象這些密鑰的位置提供了某些“容器”。
如果我們的公鑰/私鑰保存在一個csp容器里,則應該使用 system.reflection.assemblykeynameattribute 特性或者 al.exe 的 /keyn[ame] 命令行開關;而當使用sn.exe將私有密鑰添加到延遲簽名的程序集商時,則用 -rc 命令行開關代替 -r 。
3.7 強命名程序集的私有部署
不一定都得裝到gac中,實際上,如果只有少數程序共享到你的程序集時,你的強命名程序集也可以進行私有部署。當其他程序集引用該程序集時得為其安裝一個xml配置文件(2.7中1例子有說明)。
3.8 并存執行
clr能夠將名稱相同但路徑不同的多個文件加載到同一個地址空間,這在.net框架中稱為并存(side-by-side)執行,它是解決windows中“dll hell”問題的一項關鍵技術。dll的并存執行能力允許我們創建的新版本程序集不必維持向后兼容。
(都是因為強命名的程序集用文件名(無擴展名)、版本號、語言文化標識及一個公有密鑰標記標識,可以將同一名稱的程序集同本公司其他版本程序集、其他公司的程序集區分開來。)
3.9 clr如何解析類型引用
例子:
public class app {
static public void mian(system.string[] args) {
system.console.writeline(“hi”)’
}
}
該代碼被編譯生成一個程序集app.exe。當我們運行該應用程序時,clr將加載并初始化它。然后clr會讀取該程序集的clr表頭來尋找標識應用程序入口方法(main)的methoddeftoken。根據methoddef元數據表,clr會定位到文件中該方法的il代碼所處的偏移,然后將其以jit的方法編譯為本地代碼,同時完成代碼的類型安全驗證過程,最后執行編譯后的本地代碼。
當clr以jit的方式編譯該段代碼時,它會檢測到所有應用到的類型和成員,并加載定義他們的程序集。
上面的例子里,il代碼中有一個引用為system.console.writeline。il 有一call 指令標引用的元數據標記標識了memberref 元數據中的一個條目。a、clr會查找memberref,并發現其中的一個字段指向了typeref 表中的一個條目(即 system.console 類型)。 b、從typeref條目中,clr會被導向到一個assemblyref 條目上:“mscorlib,version=1.0.3300.0,culture=”neutral”,publickeytoken=b77a5c561934e089”。到這里clr將知道自己需要哪個程序集。
3.10 高級管理控制(配置)
2.7中提到如何配置clr搜索和綁定程序集的方式,僅僅討論了定位元素privatepath屬性,本節介紹其他一些xml配置文件元素。
1、幾個配置元素:(書中的例子太長,有興趣的朋友翻翻書吧)
probing:指示clr在應用程序在其指定的目錄中查找弱命名程序集;
dependentassembly、assemblyidentity 和 bindingredirect:指示clr在定位原來指定的程序集時重新轉定位另一個指定的程序集,可以實行版本號重定向;
codebase:指示clr指示在指定的目錄或url地址查找程序集,它也可以被用于弱程序集(這種情況下,clr忽略程序集版本號及xml codebase元素中指定的版本號);
publisherpolicy:指示clr是否忽略部署的發布者策略文件。
2、clr確定程序集引用的程序集:
a、查找assemblyref表知道要引用的程序集;
b、在應用程序的配置文件中查找程序集,同時會應用其中指定的版本號重定向策略;如果publisherplocy元素的apply屬性被設置為yes或者忽略該元素clr將會檢查gac并應用任何程序集發布者認為必要的版本號重定向策略(發布者策略);
c、接著clr會到機器內的machine.config文件中查找程序集,并應用任何其中指定的版本號重定向策略;
d、最后clr知道它應該加載哪個版本的程序集,并首先試圖從gac中加載,如果程序集不在gac中,并沒有指定codebase元素,clr會按照第2章所說的規則來定位程序集。
利用這些配置文件,管理員可以完全控制clr應該加載哪些程序集。如果希望機器內所有程序集采用最新的程序集,則應該修改機器中的machine.config文件。
2.7的5提到.net中提供了方便的gui配置工具。
3.10.1 發布者策略控制
當發布者修復了原版本程序集中的bug時,希望用戶用新版本代替新版本,如果讓每個用戶自己通過修改他的應用程序集或機器上的xml配置文件是非常不方便的。發布者策略控制就可以使得在安裝新的程序集時,能夠創建可以安裝到用戶機器上的“策略信息”。
發布者策略程序集必須被安裝到gac中。
3.11 修復錯誤的應用程序
1、當控制臺或者windows窗體應用程序正在一個用戶帳號下運行時,clr會保持一個應用程序實體加載的程序集的記錄,加載信息被累積在內存中,并在程序結束時被寫入以下磁盤路徑中: c:/documents and settings/username/local settings/application data/applicationhistory
目錄中每個文件標識著一個特殊的應用程序,文件名類似:app.exe.c4bc1771.ini。其中的16進制數是一個標識文件路徑的散列值,它用來區分不同子目錄下的同名文件。
2、當一個應用程序運行時,clr會維持一個應用程序所加載的程序集的集合“快照”。當應用程序結束時,該信息將和應用程序相關聯的.ini文件內容比較:
a、如果應用程序但前加載的程序集集合和先前加載的程序集集合相同,也就是.ini文件中的信息和內存中的信息相同,內存里的信息將被丟棄;
b、如果內存中的信息不同于.ini文件中的信息,clr會將內存中的信息追加到.ini文件中。
c、默認情況下,.ini文件能夠存儲5個快照。
3、由于某種原因,如果我們運行的應用程序出了問題,因為clr保持了一個應用程序使用的程序集的歷史記錄,我們就可以為引用程序集創建一個xml配置文件,其中的元素告訴clr使用最近一次運行正常時加載的程序集。
用.net框架配置工具我們可以很容易做到這一點,運行工具――『應用程序』――『修復應用程序』,就可以進行配置。
對應用程序xml配置文件所做的改變會被注釋元素標識,注釋元素包括:“.net appliction restore beginblock”和“.net appliction restore endblock”
(以上是本書的第一部分,講的東西都是.net很基礎的東西,有的地方還是很有難度的,看來要好好學一本書也不容易。希望大家討論討論。
前幾天天一下的冷下來,對于一直在過暖冬的我還真有點不適應,白天沒空整理,夜里房里又沒暖氣,手僵敲不出字來,加上年底雜事多,本來早該整理完的前三章也拖到了2005年。向各位朋友說聲:新年好!
這幾天一冷就躺被窩書是沒看了,收獲就是看了央視的《荊柯傳奇》,劇情一般般其中的片尾曲倒是不錯,發歌詞和大伙共享:
紅顏
劍煮酒無味飲一杯為誰
你為我送別你為你送別
胭脂香味能愛不能給
天有多長地有多遠
你是英雄就注定無淚無悔
這笑有多危險是穿腸毒藥
這淚有多么美只有你知道
這心沒有你活著可笑
這一世英名我不要
只求換來紅顏一笑
這一去如果還能輪回
我愿意來生作牛馬
也要與你天涯相隨
劍煮酒無味飲一杯為誰
你為我送別你為你送別
胭脂香味能愛不能給
天有多長地有多遠
你是英雄就注定無淚無悔
這笑有多危險是穿腸毒藥
這淚有多么美只有你知道
這心沒有你活著可笑
這一世英名我不要
只求換來紅顏一笑
這一去如果還能輪回
我愿意來生作牛馬
也要與你天涯相隨
)
菜鳥學堂: