天天看點

在Win7中安裝程式集到GAC

      微軟為提高系統安全,自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]

 指定對要安裝或解除安裝的一個或多個程式集的跟蹤引用。與 /i、/il、/u 或 /ul 選項一起指定此選項。

若要安裝程式集,請在使用此選項的同時指定 assemblyPath、scheme、id和 description 參數。若要解除安裝程式集,請指定 assemblyName、scheme、id和 description 參數。

若要移除對程式集的引用,必須指定在安裝程式集時使用 /i 和 /r(或 /ir)選項指定的 scheme、id 和 description 參數。如果解除安裝程式集,則全局程式集緩存工具還從全局程式集緩存中移除該程式集,條件是它是最後一個要移除的引用,并且 Windows Installer 沒有對該程式集的未決引用。

scheme 參數指定安裝方案的類型。可以指定以下值之一:

UNINSTALL_KEY:如果安裝程式将應用程式添加到 Microsoft Windows 中的“添加/删除程式”,則指定該值。應用程式通過将系統資料庫項添加到 HKLM/Software/Microsoft/Windows/CurrentVersion 中而将自己添加到“添加/删除程式”中。

FILEPATH:如果安裝程式沒有将應用程式添加到“添加/删除程式”中,則指定該值。

OPAQUE:如果提供的系統資料庫項或檔案路徑不适于您的安裝方案,則指定該值。該值允許您為 id 參數指定自定義資訊。

為 id 參數指定的值取決于為 scheme 參數指定的值:

如果為 scheme 參數指定 UNINSTALL_KEY,請在 HKLM/Software/Microsoft/Windows/CurrentVersion 系統資料庫項中指定應用程式集的名稱。例如,如果系統資料庫項是 HKLM/Software/Microsoft/Windows/CurrentVersion/MyApp,請指定 MyApp 作為 id 參數。

如果為 scheme 參數指定 FILEPATH,請将安裝程式集的可執行檔案的完整路徑指定為 id 參數。

如果為 scheme 參數指定 OPAQUE,則可以将任何一段資料作為 id 參數提供。所指定的資料必須用引号 ("") 括起來。

description 參數允許您指定關于要安裝的應用程式的描述性文本。當枚舉引用時,顯示此資訊。

/silent

 取消所有輸出的顯示。

/u assemblyName

 從全局程式集緩存中解除安裝程式集。

/uf assemblyName

 通過移除對程式集的所有引用來強制解除安裝指定的程式集。

指定此選項相當于同時指定 /u 和 /f 選項。

注意

不能使用此選項移除使用 Microsoft Windows Installer 所安裝的程式集。如果嘗試此操作,則全局程式集緩存工具顯示錯誤資訊。

/ul assemblyListFile

 從全局程式集緩存中解除安裝 assemblyListFile 中指定的一個或多個程式集。

/u[ngen] assemblyName

 從全局程式集緩存中解除安裝指定的程式集。如果指定的程式集存在現有引用數,則全局程式集緩存工具顯示引用數,而且不從全局程式集緩存中移除該程式集。

在 .NET Framework 2.0 版中,不支援 /ungen。而是使用本機映像生成器 (Ngen.exe) 的 uninstall 指令。

在 .NET Framework 1.0 和 1.1 版中,指定 /ungen 将使 Gacutil.exe 從本機映像緩存中移除該程式集。此緩存存儲了使用本機映像生成器 (Ngen.exe) 建立的程式集的本機映像。

/ur assemblyName

 從全局程式集緩存中解除安裝對指定程式集的引用。若要移除對程式集的引用,必須指定在安裝程式集時使用 /i 和 /r(或 /ir)選項指定的 scheme、id 和 description 參數。有關可為這些參數指定的有效值的說明,請參見 /r 選項。

指定此選項相當于同時指定 /u 和 /r 選項。

/?

(2)Sn.exe(強名稱工具)說明

      強名稱工具 (Sn.exe) 有助于使用強名稱對程式集進行簽名。Sn.exe 提供用于密鑰管理、簽名生成和簽名驗證的選項。

強名稱工具自動與 Visual Studio 一起安裝。要啟動工具,請使用 Visual Studio 指令提示符。在指令提示處,鍵入下列指令:

sn [-quiet][option [parameter(s)]]

參數

選項

 說明

-c [csp]

 将預設加密服務提供程式 (CSP) 設定為用于強名稱簽名。此設定應用于整台計算機。如果不指定 CSP 名稱,則 Sn.exe 将清除目前設定。

-dcontainer

 從強名稱 CSP 中删除指定的密鑰容器。

-Dassembly1 assembly2

 驗證兩個程式集是否隻是簽名不同。這經常用作使用不同的密鑰對重新為程式集建立簽名後的檢查。

-eassembly outfile

 從 assembly 中提取公鑰并将其存儲在 outfile 中。

-h

-iinfile 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,則此選項顯示目前設定。

-oinfile[outfile]

 從 infile 中提取公鑰并将其存儲在 .csv 檔案中。公鑰的每一位元組都由逗号分隔。這種格式對于在源代碼中将公鑰的寫死引用作為初始化數組很有用。如果不指定 outfile,則此選項将輸出放到剪貼闆上。

說明

此選項不驗證輸入的是否隻是公鑰。如果 infile 包含帶有私鑰的密鑰對,則會同時提取私鑰。

-pinfile 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 選項除顯示标記外還顯示公鑰。

-TSassemblyinfile

 使用 infile 中的密鑰對,對已簽名或部分簽名的 assembly 進行測試簽名。

-TScassemblycontainer

 使用密鑰容器 container 中的密鑰對,對已簽名或部分簽名的 assembly 進行測試簽名。

-vassembly

 驗證 assembly 中的強名稱,其中 assembly 是包含程式集清單的檔案名。

-vfAssembly — 程式集

 驗證程式集中的強名稱。與 -v 選項不同,-vf 會強制實施驗證,即使已使用 -Vr 選項禁用了驗證。

-Vl

 列出此計算機上的強名稱驗證的目前設定。

-Vrassembly [userlist] [infile]

 注冊 assembly 以跳過驗證。或者,可以指定用逗号分隔的使用者名清單。如果指定 infile,則驗證保持啟用,但 infile 中的公鑰将用于驗證操作。可以 *, strongname 的形式指定程式集,以注冊所有具有指定強名稱的程式集。Strongname 應指定為十六進制數字的字元串以表示标記形式的公鑰。參見 -t 和 -T 選項以顯示公鑰标記。

警告

僅在開發期間使用此選項。将程式集添加到跳過驗證清單會産生安全漏洞。如果将某程式集添加到跳過驗證清單中,則惡意程式集可以使用該程式集的完全指定程式集名稱來隐藏身份,完全指定程式集名稱由程式集名稱、版本、區域性和公鑰标記組成。這使惡意程式集也可以跳過驗證。

-VuAssembly — 程式集

 登出 assembly,不跳過驗證。應用于 -Vr 的同一程式集命名規則也應用于 -Vu。

-Vx

 移除所有驗證跳過項。

-?