??? ? 微軟為提高系統安全,自Vista推出后,在Windows系統中加入了一個新的東東——UAC(User Account Control),這樣一個新的技術使得許多操作都受到了約束,尤其是對系統設置、文件的修改,Win7作為一個衍生品,也受到了UAC的保護。
????? 在.NET項目開發中,針對一些類庫項目或用戶控件項目,當程序開發完成后,有時需要將開發的程序集,安裝部署到GAC( Global Assembly Cache )中,以便其他的程序也可以調用。
??????通常,將程序集安裝到GAC有兩種方法:
????? 1、將程序集(dll文件)手動拖至?C:/Windows/assembly 文件夾中。
??????2、利用全局程序集緩存工具Gacutil進行安裝。
?
??????在Win7中第一種方法無法使用,會出現“訪問被拒絕的錯誤”,只能使用第二種方法。
????? 以管理員身份運行“Visual Studio 2008 命令提示”,然后在命令行中輸入如下命令:
??????1、安裝程序集:
?????? gacutil -i Demo.dll
????? 2、卸載程序集:
????? gacutil -u Demo
?
????? 在執行程序集的安裝之前,應該給項目加強名稱,具體如下:
????? 1、以管理員身份運行“Visual Studio 2008 命令提示”,然后在命令行中輸入如下命令:
????? sn -k myKey.snk (擴展名可以任意)
????? 2、將密鑰與項目程序集關聯。在VS開發環境中:項目屬性-->簽名-->為程序集簽名-->選擇強名稱密鑰文件
????? 3、重新生成程序集。
?
附:
(1)全局程序集緩存工具 (Gacutil.exe)說明
全局程序集緩存工具使您可以查看和操作全局程序集緩存和下載緩存的內容。
gacutil [options] [assemblyName | assemblyPath | assemblyListFile] ?
參數 | 說明 |
---|---|
assemblyName |
程序集的名稱。可以提供部分指定的程序集名稱(如 myAssembly )或完全指定的程序集名稱(如 myAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5 )。 |
assemblyPath |
包含程序集清單的文件的名稱。 |
assemblyListFile |
列出要安裝或卸載的程序集的 ANSI 文本文件的路徑。若要使用文本文件安裝程序集,請在文件中的單獨一行上分別指定每個程序集的路徑。全局程序集緩存工具解釋相對于 assemblyListFile 的位置的相對路徑。若要使用文本文件卸載程序集,請在文件中的單獨一行上分別為每個程序集指定完全限定的程序集名稱。請參見本主題后面的 assemblyListFile 內容示例。 |
選項 | 說明 | ||
---|---|---|---|
/cdl |
刪除下載緩存的內容。 |
||
/f |
與 /i 或 /il 選項一起指定此選項將強制重新安裝程序集。如果全局程序集緩存中已經存在同名的程序集,全局程序集緩存工具將改寫該程序集。 |
||
/h [ elp ] |
顯示該工具的命令語法和選項。 |
||
/i ? assemblyPath |
將程序集安裝到全局程序集緩存中。 |
||
/if assemblyPath |
將程序集安裝到全局程序集緩存中。如果全局程序集緩存中已經存在同名的程序集,全局程序集緩存工具將改寫該程序集。 指定此選項相當于同時指定 /i 和 /f 選項。 |
||
/il ? assemblyListFile |
將 assemblyListFile 中指定的一個或多個程序集安裝到全局程序集緩存中。 |
||
/ir assemblyPath scheme id description |
將程序集安裝到全局程序集緩存中,并添加引用以對程序集進行計數。使用此選項時必須指定 assemblyPath 、 scheme 、 id 和 description 參數。有關可為這些參數指定的有效值的說明,請參見 /r 選項。 指定此選項相當于同時指定 /i 和 /r 選項。 |
||
/l [ assemblyName ] |
列出全局程序集緩存的內容。如果指定 assemblyName 參數,則全局程序集緩存工具只列出與該名稱匹配的程序集。 |
||
/ldl |
列出下載文件緩存的內容。 |
||
/lr [ assemblyName ] |
列出所有程序集及其相應的引用數。如果指定 assemblyName 參數,則該工具只列出與該名稱匹配的程序集及其相應的引用數。 |
||
/nologo |
取消顯示 Microsoft 啟動標題。 |
||
/r [ assemblyName | assemblyPath ] scheme id description |
指定對要安裝或卸載的一個或多個程序集的跟蹤引用。與 /i 、 /il 、 /u 或 /ul 選項一起指定此選項。 若要安裝程序集,請在使用此選項的同時指定 assemblyPath 、 scheme 、 id 和 description 參數。若要卸載程序集,請指定 assemblyName 、 scheme 、 id 和 description 參數。 若要移除對程序集的引用,必須指定在安裝程序集時使用 /i 和 /r (或 /ir )選項指定的 scheme 、 id 和 description 參數。如果卸載程序集,則全局程序集緩存工具還從全局程序集緩存中移除該程序集,條件是它是最后一個要移除的引用,并且 Windows Installer 沒有對該程序集的未決引用。 scheme 參數指定安裝方案的類型。可以指定以下值之一:
為 id 參數指定的值取決于為 scheme 參數指定的值:
description 參數允許您指定關于要安裝的應用程序的描述性文本。當枚舉引用時,顯示此信息。 |
||
/silent |
取消所有輸出的顯示。 |
||
/u assemblyName |
從全局程序集緩存中卸載程序集。 |
||
/uf assemblyName |
通過移除對程序集的所有引用來強制卸載指定的程序集。 指定此選項相當于同時指定 /u 和 /f 選項。
|
||
/ul ? assemblyListFile |
從全局程序集緩存中卸載 assemblyListFile 中指定的一個或多個程序集。 |
||
/u [ ngen ] assemblyName |
從全局程序集緩存中卸載指定的程序集。如果指定的程序集存在現有引用數,則全局程序集緩存工具顯示引用數,而且不從全局程序集緩存中移除該程序集。
在 .NET Framework 1.0 和 1.1 版中,指定 /ungen 將使 Gacutil.exe 從本機映像緩存中移除該程序集。此緩存存儲了使用 本機映像生成器 (Ngen.exe) 創建的程序集的本機映像。 |
||
/ur assemblyName scheme id description |
從全局程序集緩存中卸載對指定程序集的引用。若要移除對程序集的引用,必須指定在安裝程序集時使用 /i 和 /r (或 /ir )選項指定的 scheme 、 id 和 description 參數。有關可為這些參數指定的有效值的說明,請參見 /r 選項。 指定此選項相當于同時指定 /u 和 /r 選項。 |
||
/? |
顯示該工具的命令語法和選項。 |
(2)Sn.exe(強名稱工具)說明
????? 強名稱工具 (Sn.exe) 有助于使用 強名稱 對程序集進行簽名。 Sn.exe 提供用于密鑰管理、簽名生成和簽名驗證的選項。
強名稱工具自動與 Visual Studio 一起安裝。 要啟動工具,請使用 Visual Studio 命令提示符 。 在命令提示處,鍵入下列命令:
選項 |
說明 |
---|---|
-c [ csp ] |
將默認加密服務提供程序 (CSP) 設置為用于強名稱簽名。 此設置應用于整臺計算機。 如果不指定 CSP 名稱,則 Sn.exe 將清除當前設置。 |
-d container |
從強名稱 CSP 中刪除指定的密鑰容器。 |
-D assembly1 assembly2 |
驗證兩個程序集是否只是簽名不同。 這經常用作使用不同的密鑰對重新為程序集創建簽名后的檢查。 |
-e assembly outfile |
從 assembly 中提取公鑰并將其存儲在 outfile 中。 |
-h |
顯示該工具的命令語法和選項。 |
-i infile container |
從指定密鑰容器中的 infile 安裝密鑰對。 密鑰容器位于強名稱 CSP 中。 |
-k ?[ keysize ] outfile |
生成一個指定大小的新 RSACryptoServiceProvider 密鑰并將其寫入指定的文件。 公鑰和私鑰都寫入該文件。 如果不指定密鑰大小,并且已安裝了 Microsoft Enhanced Cryptographic Provider,則默認情況下生成 1,024 位的密鑰;否則,生成 512 位的密鑰。 如果安裝了 Microsoft Enhanced Cryptographic Provider,則 keysize 參數支持 384 位至 16,384 位(增量為 8 位)的密鑰長度。 如果安裝了 Microsoft Base Cryptographic Provider,則支持 384 位至 512 位(增量為 8 位)的密鑰長度。 |
-m [ y | n ] |
指定密鑰容器是特定于計算機的還是特定于用戶的。 如果指定 y ,則密鑰容器是特定于計算機的。 如果指定 n ,則密鑰容器是特定于用戶的。 如果既沒有指定 y 也沒有指定 n,則此選項顯示當前設置。 |
-o infile [ outfile ] |
從 infile 中提取公鑰并將其存儲在 .csv 文件中。 公鑰的每一字節都由逗號分隔。 這種格式對于在源代碼中將公鑰的硬編碼引用作為初始化數組很有用。 如果不指定 outfile ,則此選項將輸出放到剪貼板上。
說明
此選項不驗證輸入的是否只是公鑰。
如果
infile
包含帶有私鑰的密鑰對,則會同時提取私鑰。
|
-p infile outfile |
從 infile 中的密鑰對提取公鑰并將其存儲在 outfile 中。 此公鑰可用于通過 程序集鏈接器 (Al.exe) 的 /delaysign+ 和 /keyfile 選項對程序集進行延遲簽名。 如果對程序集進行延遲簽名,則在編譯時只設置公鑰,并在文件中為以后知道私鑰時添加的簽名保留空間。 |
-pc 容器 ? outfile |
從 container 中的密鑰對中提取公鑰并將其存儲在 outfile 中。 |
-Pb [ y | n ] |
指定是否強制執行強名稱跳過策略。 如果指定 y ,則在將完全信任程序集加載到完全信任 AppDomain 時,不驗證這些程序集的強名稱。 如果指定 n ,則會驗證強名稱的正確性,但是不會針對特定強名稱進行驗證。 StrongNameIdentityPermission 對完全信任程序集不起作用。 您必須自己對強名稱是否匹配進行檢查。 如果既沒有指定 y 也沒有指定 n ,則此選項顯示當前設置。 默認值為 y 。
說明
在 64 位計算機上,必須同時在 Sn.exe 的 32 位和 64 位實例中設置此參數。
|
-q [ uiet ] |
指定安靜模式;取消顯示成功消息。 |
-R [ a ]? assembly ? infile |
使用 infile 中的密鑰對,重新簽名先前已簽名的程序集或延遲簽名的程序集。 如果使用 -Ra ,則重新計算程序集中所有文件的哈希。 |
-Rc [ a ]? assembly container |
使用 container 中的密鑰對,重新簽名先前已簽名的程序集或延遲簽名的程序集。 如果使用 -Rca ,則重新計算程序集中所有文件的哈希。 |
-Rh ? assembly |
重新計算程序集中所有文件的哈希值。 |
-t [ p ] infile |
顯示存儲在 infile 中的公鑰的標記。 infile 的內容必須是以前使用 -p 從密鑰對文件生成的公鑰。 不要使用 -t[p] 選項直接從密鑰對文件提取該標記。 Sn.exe 使用公鑰的哈希函數計算該標記。 為節省空間,公共語言運行時在記錄對具有強名稱的程序集的依賴性時,將公鑰標記存儲在清單中,作為對另一個程序集的引用的一部分。 -tp 選項除顯示標記外還顯示公鑰。 請注意,此選項不驗證程序集簽名,而且不應用于做出信任決策。 此選項僅顯示原始公鑰標記數據。 |
-T [ p ] assembly |
顯示 程序集 的公鑰標記。 assembly 必須是包含程序集清單的文件的名稱。 Sn.exe 使用公鑰的哈希函數計算該標記。 為節省空間,公共語言運行時在記錄對具有強名稱的程序集的依賴性時,將公鑰標記存儲在清單中,作為對另一個程序集的引用的一部分。 -Tp 選項除顯示標記外還顯示公鑰。 請注意,此選項不驗證程序集簽名,而且不應用于做出信任決策。 此選項僅顯示原始公鑰標記數據。 |
-TS assembly infile |
使用 infile 中的密鑰對,對已簽名或部分簽名的 assembly 進行測試簽名。 |
- TSc assembly container |
使用密鑰容器 container 中的密鑰對,對已簽名或部分簽名的 assembly 進行測試簽名。 |
-v assembly |
驗證 assembly 中的強名稱,其中 assembly 是包含程序集清單的文件名。 |
-vf Assembly — 程序集 |
驗證 程序集 中的強名稱。 與 -v 選項不同, -vf 會強制實施驗證,即使已使用 -Vr 選項禁用了驗證。 |
-Vl |
列出此計算機上的強名稱驗證的當前設置。 |
-Vr assembly [ userlist ] [ infile ] |
注冊 assembly 以跳過驗證。 或者,可以指定用逗號分隔的用戶名列表。 如果指定 infile ,則驗證保持啟用,但 infile 中的公鑰將用于驗證操作。 可以 *, strongname 的形式指定程序集,以注冊所有具有指定強名稱的程序集。 Strongname 應指定為十六進制數字的字符串以表示標記形式的公鑰。 參見 -t 和 -T 選項以顯示公鑰標記。
警告
僅在開發期間使用此選項。
將程序集添加到跳過驗證列表會產生安全漏洞。
如果將某程序集添加到跳過驗證列表中,則惡意程序集可以使用該程序集的完全指定程序集名稱來隱藏身份,完全指定程序集名稱由程序集名稱、版本、區域性和公鑰標記組成。
這使惡意程序集也可以跳過驗證。
|
-Vu Assembly — 程序集 |
注銷 assembly ,不跳過驗證。 應用于 -Vr 的同一程序集命名規則也應用于 -Vu 。 |
-Vx |
移除所有驗證跳過項。 |
-? |
顯示該工具的命令語法和選項。 |
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
