│ HelloWorld.exe
├─ko-kr
│ HelloWorld.resources.dll
├─it
│ HelloWorld.resources.dll
├─fr
│ HelloWorld.resources.dll
├─es
│ HelloWorld.resources.dll
├─en
│ HelloWorld.resources.dll
├─en-us
│ HelloWorld.resources.dll
└─de
HelloWorld.resources.dll
通過AL工具來改變一個程序集的各種屬性:
可以參見AL的幫助
通過AssemblyInfo.cs文件來改變一個程序集的屬性:
這個文件中最重要的幾個特性是:
1、AssemblyVersion: 格式: Major Version ---- Minor Version ------ Build version ------ Revision
2、[assembly: AssemblyCulture("")]
3、[assembly: AssemblyDelaySign(false)]
4、[assembly: AssemblyKeyFile("")]
5、[assembly: AssemblyKeyName("")]
這幾個各個程序集屬性的探討
將程序集組成各種應(yīng)用程序,進行程序集的部署:
不考慮應(yīng)用程序的類型,可以將程序集的部署分為私有部署和全局部署。
私有部署:
1.本地應(yīng)用程序的部署結(jié)構(gòu)
AppDir
|---- App.exe
|---- App.exe.config
|-----AuxFilesDir
|------ xxx.dll
|------ yyy.dll
在App.exe.config中可以配置影響CLR尋找程序集路徑的選項。
2.Asp.net應(yīng)用程序和XML Web服務(wù)應(yīng)用程序
對于asp.net Web窗口和XMLWeb服務(wù)應(yīng)用程序,配置文件必須位于Web應(yīng)用程序的虛擬根目錄下,并且名稱總是Web.config 。另外子目錄也可以包含它們自己的Web.config文件,并繼承上一目錄的配置設(shè)置。
3. 對于包含客戶方空件、以微軟的IE瀏覽器為宿主的程序集。(沒有見過)
全局部署:(這里部署的都是強命名程序集)
CLR需要支持某種機制來唯一標(biāo)識程序集。一個強命名程序集包含四個唯一標(biāo)識程序集的特性:文件名(沒有擴展名)、版本號(assemblyversion)、語言文化標(biāo)識和一個公有密鑰標(biāo)記(由公有密鑰產(chǎn)生的一個值)。
這四個信息都存儲在AssemblyDef 中,其結(jié)構(gòu)示意如下:
Assembly
------------------------
Token: 0x200001
Name: xxxxx
Public Key: yyyyyyy
HashAlgorithm: 0x00008004
Major Version: 0x000001
Minor Version: 0x000000
Build Number: 0x00000253
Revision Number: 0x00005361
Locale: <null>
Flags:
生成一個強命名程序集的步驟如下:
1、使用SN -k MyCompany.keys 生成名為MyCompany.keys文件,該文件包含一對以二進制存儲的共有密鑰和私有密鑰。
2、查看共有密鑰的命令: SN -p MyCompany.keys MyCompany.PublicKey
SN -tp MyCompany.PublicKey
3、使用特性 System.Reflection.AssemblyKeyFileAttribute將公私密鑰對程序集進行簽名。
[assembly:AssemblyKeyFile("MyCompany.keys")]
4、編譯器或者AL使用公私密鑰進行簽名的過程如下:
當(dāng)生成一個強命名程序集時,該程序集的FileDef清單元數(shù)據(jù)表將包含組成該程序集的所有文件的一個列表。當(dāng)一個文件的名稱被加入到清單中時,該文件的內(nèi)容也被轉(zhuǎn)換成一個散列值,該散列值將和文件名一起存入到FileDef表中。(這里使用的散列算法可以使用AL /algid 命令開關(guān)來改變,或者 System.Reflection.AssebmlyAlgorithmIdAttribute定制特性來改變默認的散列算法(SHA-1)。
在生成包含清單的PE文件之后,該PE文件的整個內(nèi)容都被轉(zhuǎn)換成一個散列值,這里使用的算法總是SHA-1,不能夠改變。該散列值經(jīng)由發(fā)布者的私有密鑰簽名,生成的RSA數(shù)字簽名被存儲在PE文件的一個保留區(qū)域中(該保留區(qū)存在于CLR表頭中)
另外發(fā)布者的共有密鑰也被嵌入到AssebmlyDef清單元數(shù)據(jù)表中。
(密碼學(xué)中的規(guī)則應(yīng)用:使用密鑰簽名,使用公鑰解密驗證。驗證過程:使用同樣的過程將文件進行散列,最后將包含清單的文件進行散列,得出的散列值與使用公鑰解密散列簽名得出的散列值進行比較。)
共享程序集的延遲簽名:
使用延遲簽名的理由:公司的私鑰需要安全存儲,大多數(shù)公司都不允許所有的開發(fā)人員訪問私鑰。只有幾個有安全權(quán)限的人才能訪問。
程序集的延遲簽名需要執(zhí)行下面的步驟:
1.首先必須用sn 創(chuàng)建一個公共/私匙對,生成mykey.snk:
sn -k mykey.snk
2.提取公鑰,使之可以用于開發(fā)人員:
sn -p mykey.snk mypublic.snk
在文件AssemblyInfo.cs中設(shè)置AssemblyDelaySign和AssemblyKeyFile屬性:
[assembly: AssemblyDelaySign(true)]
[assembly:AssemblyKeyFile("mypublickey.snk")]]
如果使用AL 工具則可以使用如下選項來實現(xiàn):
al /keyf /delay
3.關(guān)閉簽名的驗證功能,因為程序集沒有包含簽名。
sn -Vr ShareDemo.dll
4.在發(fā)布之前,程序集可以用來實現(xiàn)重新簽名:
sn -R MyAssembly.dll mykey.snk
sn -Vu MyAssembly.dll
另一中理解方法:1,2兩步相同 3.在生成程序集后,執(zhí)行下面的命令以便后面可以將該程序集安裝到GAC中,或者生成引用該程序集的其他程序集,以及測試該程序集。注意該操作只需執(zhí)行一次,沒有必要每次生成程序集時都執(zhí)行一遍該命令。
SN -Vr MyAssembly.dll
4.當(dāng)準(zhǔn)備打包和部署程序集時,取得公司的私有密鑰,然后執(zhí)行下面的命令:
SN -R MyAssembly.dll MyCompany.keys (這個文件包含了公鑰和私鑰)
5. 執(zhí)行下面的命令,恢復(fù)驗證過程以進行測試:
SN -Vu MyAssembly.dll