程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> VS2003中設計強名稱程序集並制作安裝入GAC的MSI

VS2003中設計強名稱程序集並制作安裝入GAC的MSI

編輯:.NET實例教程

原文地址:http://www.cnblogs.com/chnking/archive/2006/02/14/330266.Html

 

1. 新建一個空解決方案

這個解決方案是為了容納下面幾個項目。

2. 新建類庫項目

在解決方案下新建類庫項目,這個類庫項目就是要生成的程序集,它會被編譯為一個獨立的dll。但是要把一個程序集放入GAC中,需要給這個程序集賦予一個強名稱的簽名

3. 生成加密密鑰對

Sdk帶有一個生成強名稱程序集簽名用的密鑰對的命令sn.exe(可以在C:\Program Files\Microsoft Visual Studio .Net 2003\SDK\v1.1\Bin目錄下找到),使用下面的命令生成一個密鑰對叫做Testkey.snk,命令如下:

    sn -k Testkey.snk

將生成密鑰對拷貝到類庫項目的根目錄下。

編輯類型項目的AssemblyInfo.cs文件,將密鑰文件屬性指向上面那個密鑰對文件

[assembly: AssemblyKeyFile("..\\..\\Testkey.snk")]

這裡的路徑是相對於編譯後的項目輸出的位置。

AssemblyInfo.cs中其他的設置根據實際需要設置即可。

一個帶有強名稱的程序集設計即告完成

4. 新建主項目

一般情況都是一個exe的主項目引用一個或者多個dll的類庫項目,我們在解決方案中新建一個主項目,引用上面步驟建立的類庫項目。

項目實現你自己想做的功能。

5. 新建一個部署項目

在解決方案中新建一個部署項目。

在部署項目的“文件系統”中,點擊右鍵“添加特殊文件夾”中選擇Global Assembly Cache Folder文件夾”,這樣在文件系統中新建了一個Global Assembly Cache Folder文件夾,這個文件夾指向系統的GAC目錄。

添加項目輸出,選擇主項目的項目主輸出,主項目的輸出會自動加入到“應用程序文件夾”。

再添加項目輸出,選擇類庫項目的主輸出,同樣類庫項目的dll也會被加入到“應用程序文件夾”。我們把這個dll從“應用程序文件夾”拖到“Global Assembly Cache Folder文件夾”。這樣系統安裝時會把這個dll安裝到GAC了。

6. 最後設置程序目錄和桌面上是否要放置程序的輸出項

7.  build部署項目,生成msi

8. 在目標機器上安裝這個msi,安裝完畢會在C:\Windows\assembly找到剛才類庫中生成的dll,已經作為一個全局程序集加入到GAC中。在GAC中同時能夠看到這個dll的版本,語言和強名稱中的public key的一部分public key token。

 

在整個過程中有幾點需要特別注意:

1. 一般的軟件我們都希望能夠在出了新版本後生成msi在客戶機上安裝能夠自動刪除原先的版本後安裝新版本。同樣vs2003也提供了這樣的選項,在部署項目屬性中RemovePreviousVersion屬性設置為true,指示系統在安裝之前刪除老版本。

2.如果一個部署項目上ProductName和應用文件夾的DefaultLocation不變,則會被認為是同一個程序。部署項目的version和ProductCode和UpgradeCode改變後會被認為同一個程序的版本升級。如果只改變了version沒有同時更改ProductCode和UpgradeCode,會被系統認為還是同一個版本的程序,在已有了原來系統的機器上不能再次安裝。

3. 項目中安裝到GAC的dll項目也會同整個軟件一起被安裝被卸載,但是這個dll的版本跟部署項目設置的版本不同,

$False$

刪除時系統會根據msi中帶的dll的程序集的完整標識即程序集名稱、version、cultrue、key token四項來檢查。當msi中的dll的四項跟在GAC中的dll有一項不同,則被認為是不同版本的dll,在升級安裝時不會刪除原來的dll,同時將新版本的dll加入到GAC。

4.在部署項目中加入到GAC的dll需要有個特殊的設置,就是要把這個dll的屬性中Permanent設置為ture,表示卸載應用程序時是否移除項目輸出文件。這裡一定要設為true,在每次更新安裝時會將沒有改動的dll先從gac刪除然後再安裝進去。如果沒設為true,程序更新安裝時不會先將gac中的這個dll卸掉,安裝時會把這個dll再安裝一次,結果發現gac中有一個跟自己一模一樣的dll,msi就會執行一個刪除操作,把這個dll從gac中刪除。最後的結果就是,項目中的其他部分都更新了,但是這個dll卻沒有了,導致系統不能正常使用。

奇怪的是,項目中其它的文件不需要將Permanent設置為ture,它也會在升級安裝時先刪除文件,然後安裝新的文件。 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved