網站首頁 編程語言 正文
一、什么是強名稱
強名稱是一個由程序集的標識組成并通過公鑰和數字簽名(針對該程序集生成)加強的名稱,其中的標識包括程序集的簡單文本名稱、版本號和區域性信息。
由于程序集清單包含構成程序集實現的所有文件的文件散列,因此只對程序集中包含程序集清單的一個文件生成數字簽名就足夠了。強名稱相同的程序集應該是相同的。
為什么要使用強名稱簽名
通過簽發具有強名稱的程序集,您可以確保名稱的全局唯一性。強名稱還特別滿足以下要求:
- 強名稱依賴于唯一的密鑰對來確保名稱的唯一性。任何人都不會生成與您生成的相同的程序集名稱,因為用一個私鑰生成的程序集的名稱與用其它私鑰生成的程序集的名稱不相同。
- 強名稱保護程序集的版本沿襲。強名稱可以確保沒有人能夠生成您的程序集的后續版本。用戶可以確信,他們所加載的程序集的版本出自創建該版本的同一個發行者。
- 強名稱提供可靠的完整性檢查。通過.NET框架安全檢查后,即可確信程序集的內容在生成后未被更改過。但請注意,強名稱中或強名稱本身并不暗含某一級別的信任,例如由數字簽名和支持證書提供的信任。
- 在引用具有強名稱的程序集時,您應該能夠從中受益,例如版本控制和命名保護。如果此具有強名稱的程序集以后引用了具有簡單名稱的程序集,則您將失去使用具有強名稱的程序集帶來的好處,并依舊會產生DLL沖突。因此,具有強名稱的程序集只能引用其他具有強名稱的程序集。
注意:強名稱的應用程序只能引用強名稱的dll,不能引用未強名稱的dll,但是未強名稱的dll可以引用強名稱的dll。
二、如何設置強名稱
上面我們講了什么是強簽名,以及強簽名的好處,下面我們來看看如何給應用程序設置強名稱。
1、應用程序有源代碼
打開vs tool command,如下圖所示:
1、生成公鑰
然后進入要設置強名稱的dll文件所在的路徑,使用下面的命令生成簽名公鑰:
sn -k StrongName.snk
如下圖所示:
2、設置簽名公鑰
將公鑰加入項目中,并設置項目屬性,設置簽名公鑰:
最后重新生成項目即可。
2、應用程序沒有源代碼
如果項目中引用了其它第三方的dll文件,而且還沒有源代碼,并且此dll文件是沒有強名稱的程序集,則在編譯時會出現類似“程序集生成失敗--引用的程序集XXX沒有強名稱”。
比如我在程序中使用到了Dapper,而Dapper是沒有強名稱的,所以生成的時候報錯了,如下圖所示:
這時我們就需要把Dapper變成有強名稱的程序集。
1、打開SDK命令提示窗口
我們這里以VS 2012為例打開SDK命令提示窗口,如下圖所示:
然后需要進入Dapper.dll文件所在的目錄:
2、創建一個新的隨機密鑰對
使用下面的命令生成一個隨機的密鑰對。
sn -k Dapper.snk
如下圖所示:
3、反編譯目標程序集
使用下面的命令反編譯目標程序集,該指令會反匯編該dll并生成Dapper.il,如果該dll含有嵌入的resource,則會有Dapper.res文件產生,并有相應的嵌入資源文件產生。
ildasm Dapper.dll /out=Dapper.il
如下圖所示:
4、重新編譯,附帶強命名參數
使用下面的命令重新編譯Dapper.dll,然后會附帶強命名參數
ilasm Dapper.il /dll /resource=Dapper.res /key=Dapper.snk /optimize
如下圖所示:
這樣就表示編譯成功了。
5、驗證簽名信息
編譯成功以后,我們使用下面的命令來驗證重新編譯后的dll文件是否帶有強名稱
sn -v Dapper.dll
如下圖所示:
這就表示重新編譯后的dll文件有了強名稱。
6、重新引用
編譯成功以后,會在目錄下面生成這么幾個文件:
可以看到:Dapper.dll這個文件是最新生成的,我們在項目里面重新引用上面新編譯的Dapper.dll文件,然后重新編譯項目:
可以看到,這時就不會報Dapper.dll沒有強名稱的錯誤了。其它沒有強名稱的dll文件也使用同樣的方式進行處理。
原文鏈接:https://www.cnblogs.com/dotnet261010/p/12401843.html
相關推薦
- 2022-08-16 Oracle數據庫事務的開啟與結束詳解_oracle
- 2022-12-30 解決React報錯Style?prop?value?must?be?an?object_React
- 2023-12-10 怎么給數據庫某個字段建立一個前綴索引
- 2023-04-02 C語言中的線程信號控制詳解_C 語言
- 2022-08-07 Redis如何存儲對象_Redis
- 2022-11-02 kotlin協程之coroutineScope函數使用詳解_Android
- 2022-12-07 Android?IdleHandler使用方法詳解_Android
- 2022-09-25 瀏覽網站時發生的過程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支