VS2019制作安裝包與ClickOnce部署


前言

  • 普通項目生成Debug或者Release文件夾后,總不好把這個目錄直接丟給客戶。
  • 程序需要一些運行時支持,不同PC機上預裝的環境也不同。
  • 我們可以制作安裝包。
  • 我們的程序可能會存在某些隱性的bug,客戶或許會有新的需求,我們會不斷地修改程序。
  • 這樣我們每次都要制作發布一次安裝包,而客戶每次都要點擊N次"下一步"重新進行安裝,很繁瑣。
  • 我們可以使用ClickOnce部署方式。

簡介

  • Windows Installer由用戶自身選擇安裝目錄,默認安裝在Program Files下,而ClickOnce程序則安裝在ClickOnce緩存中。
  • ClickOnce緩存是"當前用戶\Documents and Settings\Local Settings"目錄下的一系列隱藏目錄。
  • ClickOnce應用程序會顯示在"添加/刪除程序"控制面板選項上,與Windows Installer的應用程序一樣。
  • ClickOnce應用程序所能占用的空間量受配額限制,配額限制了ClickOnce 緩存的大小。緩存大小應用於所有用戶的聯機應用程序,單個部分信任的聯機應用程序最多只能占用配額空間的一半。安裝的應用程序不受緩存大小的限制。對於所有 ClickOnce 應用程序,緩存只保留當前版本和前一個安裝的版本。因此與普通的應用程序只能卸載不同,ClickOnce應用程序還可以選擇回退到之前的版本。
  • 默認情況下,客戶端計算機有250MB的存儲區供聯機ClickOnce應用程序使用。數據文件不計入該限制。系統管理員可以通過改變注冊表項"HKEY_CURRENT_USER\Software\Classes\Software\Microsoft\Windows\CurrentVersion\Deployment\OnlineAppQuotaInKB"來修改此配額。該注冊表項是一個用千字節表示緩存大小的DWORD值。例如,要將緩存大小減小到50MB,應該將該值更改為51200。

制作安裝包

1、安裝Installer Projects插件

Installer Projects插件

2、創建"Setup Project"項目

Setup Project

輸入項目文件名:

輸入項目文件名稱

你可以通過添加"項目主輸出",來添加應用程序,此時項目生成的EXE和相關DLL將會被添加到"Application Folder"中,也就是安裝好程序之后的主目錄:

添加項目主輸出

這里選擇的是你的啟動項目:

項目主輸出

點擊"確定":

選擇完項目主輸出后

注意此時程序目錄中,只有你程序生成的DLL和EXE文件,如果你的應用程序還需要相關的資源文件或者其它內容,需要在"Applcation Folder"上手動添加文件夾和所需文件,就像下面這樣:

手動添加相應的資源文件

通常我們還會為用戶創建桌面快捷方式:

創建快捷方式

將上一步生成的"Shortcut to 主輸出..."拖拽到"User's Desktop"目錄下:

創建快捷方式

選擇它的屬性進行修改:

修改快捷方式屬性

從上到下分別是快捷方式的名稱、備注以及圖標。

  • 需要注意的是圖標僅能從"Application Folder"中進行選取,如果你不想使用系統默認的程序圖標,需要手動將圖標文件添加到"Application Folder"中,再在屬性里進行選擇。
  • 如果你添加圖標后,發現快捷方式的圖標還是默認的系統圖標,有可能是你添加的圖片分辨率太大,系統加載不了(推薦32×32),也有可能是你主程序生成的exe沒有選擇程序圖標。

選擇應用程序圖標

通常我們還會為用戶准備一份卸載程序,這里我們需要用到"C:\Windows\System32\msiexec.exe",你可以直接使用C盤中的程序,生成的時候會提示一個警告:

'msiexec.exe' should be excluded because its source file 'C:\Windows\System32\msiexec.exe' is under Windows System File Protection

雖然無傷大雅,但仍然建議拷貝一份"msiexec.exe"出來到"Application Folder"下,然后我們創建它的快捷方式,並命名為Uninstall.exe,或者你喜歡的任意名稱。

創建Uninstall

我們先去"安裝項目"的屬性窗口,需要注意這里的"屬性"並非是"右鍵項目->屬性"出來的屬性窗,找到程序的ProductCode,拷貝下來。

回到我們的"Uninstall.exe"快捷方式的屬性,在Arguments一欄填上"/x "加上面拷貝的ProductCode,注意兩者之間中間有空格,如下圖所示:

為Uninstall添加參數

至此,我們的安裝程序和卸載程序就創建完畢,生成項目,可以看到兩個文件,如下所示:

生成安裝程序

其中"setup.exe"包括環境等一系列檢查,推薦使用這個進行程序安裝,而"*.msi"程序則安裝的是程序的實體。

如果你還想給用戶開始菜單中添加你程序和卸載的快捷方式的話,你只需重復上面的步驟,將兩個快捷方式,拷貝到"User's Programs Menu"目錄下即可,這里不再重復說明。

最后我們提一下,點擊"安裝項目->右鍵屬性"中的屬性頁窗口,主要是在"Prerequesites"中選擇你應用程序需要的環境支持:

先決條件

通常系統會為你選擇最恰當的環境需求,當然你也可以根據你的實際需要進行配置。

ClickOnce部署示例

以下是一個顯示當前程序版本的簡單桌面應用程序(.net framework 4.8),程序實際代碼如下所示:

public FrmShowVersion()
{
	InitializeComponent();
	txtCurVersion.Text = GetProgramVersion();
}

string GetProgramVersion()
{
	StringBuilder result = new StringBuilder();
	try
	{
		result.AppendLine($"程序集版本:{Assembly.GetExecutingAssembly().GetName().Version}");
		result.AppendLine();
		result.AppendLine($"文件版本:{Application.ProductVersion}");
		result.AppendLine();
		result.AppendLine($"部署版本:{ApplicationDeployment.CurrentDeployment.CurrentVersion}");
	}
	catch 
	{
		//未設置部署的相關信息時,想顯示部署版本信息時會拋出異常
	}
	return result.ToString();
}

運行如下所示:

1.0版本運行效果

點擊項目->右鍵選擇屬性->在標簽頁中選擇"發布",進入發布窗口:

VS發布窗口

下面我們依次介紹:

  • 發布文件夾位置:可選項只有本地文件夾或者ftp服務器,演示的時候我們選擇在本地新建一個文件夾:"D:\ClickOncePublish",這是給你自己發布程序用的。

發布文件夾位置

  • 安裝文件夾URL(如果與以上不同):支持文件系統、FTP和IIS,實際我在測試的時候,設置為本地文件的時候不行,僅能支持網絡共享文件夾。演示程序中,我們用IIS創建了一個網站,網站物理路徑選的是發布文件夾的路徑"D:\ClickOncePublish",如下所示:

自動更新網站

你可以根據你的實際應用環境換成共享文件夾或者ftp服務器,這是給客戶安裝和更新程序用的,這里我們選擇剛創建好的網站作為安裝和更新路徑,如下圖所示:

選擇IIS站點作為程序安裝和更新路徑

  • 安裝模式里我們選擇脫機也能使用,聯機選項我估計你沒有Internet連接的時候會出問題,有興趣的可以試一下。
  • 應用程序文件:讓你設置哪些文件要生成,哪些文件不生成,如下所示:

應用程序文件

  • 系統必備組件:就是運行你這個程序需要什么環境支持,跟我們制作安裝包的時候的Prerequisites一樣,如下所示:

系統必備組件

  • 更新:就是設置各種更新的詳細信息,默認是什么都沒有選的,我們的演示程序如下設置:

程序更新設置

  • 選項:這里設置程序的說明信息,這里我們選上了部署網頁,你還可以在清單里勾上"創建桌面快捷方式":

發布選項

  • 隨每次發布自動遞增修訂號:默認是勾上的,你也可以根據你的實際情況直接修改版本號。

  • 發布向導:就是把上面的部分必要的設置過程用向導的方式讓你填寫,值得一提的是,如果你試圖在這里把更新位置選成本地文件夾,會得到一個錯誤信息:

發布向導報錯

  • 設置完成后,你就可以在這里點擊"立即發布",或者在項目上右鍵選擇"發布",如果你配置了顯示發布網頁,則會彈出如下的網頁:

發布成功

  • 此時發布目錄里的文件如下所示,其中"*.application"是程序實體,而"setup.exe"在安裝前會進行環境檢查:

發布目錄里的文件

安裝環境檢查

程序實體安裝

  • 安裝完成后,運行效果如下所示:

首次安裝

  • 接下來我們修改一下我們的程序,給窗體添加一個"確定"按鈕,並再次"發布",此時我們可以看到我們早先設置的發布路徑"D:\ClickOncePublish"子目錄"Application Files"下多了一份程序,每次發布,新版本都會在此目錄下進行保存,因此要小心文件夾占用空間過大。如下所示:

二次生成之后

  • 用戶在打開我們程序的時候就會提示更新,他可以選擇"跳過"(不建議,跳過后想更新只能重新安裝或者等下一次新發布),那么他用的還是舊程序,如果選擇"確定",則會下載新的程序:

ClickOnce更新提示

  • "確定"之后用戶更新了他的程序,如下所示:

成功更新

  • 與Windows Installer安裝的程序不同的是,我們在卸載ClickOnce程序的時候,會提示是否要回滾前一個版本,如下所示:

卸載ClickOnce安裝的程序

  • 經測試,僅能回滾到前一個版本,不能無限回滾,之后只能選擇移除程序。

證書制作

細心的同學可能會發現,當我們發布程序的時候,項目文件里多了一個"ClickOnceDemo_TemporaryKey.pfx"文件,這個是系統自動給我們生成的簽名文件,你可以在"項目屬性->簽名"里看到,它只有一年的有效期:

如果你還有印象的話,我們上面在安裝的時候,實際上系統仍然認為我們是"未知的發行者"而提出警告,因為這個證書是我們自己頒給自己的,操作系統認為這不行:

程序實體安裝

因此,我們需要一份能夠設定日期的並且能讓系統認證通過的證書。

1、先找到你的VS命令行工具

通常在"開始菜單->Visual Studio"下應該能看到,譬如我裝的VS2019,我的是"Developer Command Prompt for VS 2019"。如果你找不到,請參考Visual Studio 開發人員命令提示和開發人員 PowerShell

我們首先執行下面的命令:

makecert –r –n "CN=Zenronphy" –b 05/08/2021 –e 05/08/2026 –sv my.pvk my.cer

以上參數的意思是:

  • -r:創建自簽署證書。
  • -n:指定主題的證書名稱,你可以填寫所有的信息,如"CN=公司名稱, E=E-MAIL地址, O=組織名稱, OU=組織單位, C=國家, S=省份(州), P=縣城"。
  • -b:起效時間,格式為MM/dd/yy。
  • -e:失效時間,格式為MM/dd/yy。
  • -sv:生成.pvk 私鑰文件。如果該文件不存在,系統將創建一個。

執行指令,將會彈出下面的創建密碼窗口,請記住這個密碼,后面我們會用上,當然你也可以選擇None留空。這里我們簡單的設置為:123456。

創建私鑰密碼

如果你選擇了創建密碼,接下來會彈出密碼輸入窗口,這個是用剛才創建的密碼來創建證書,輸錯了就得重來一遍。

創建成功后,你就得到了my.pvk和my.cer兩個文件。

2、將cer文件轉換成spc文件

同樣在VS命令行工具里執行:

cert2spc my.cer my.spc

這樣你就得到了一個my.spc文件,spc是Software Publisher Certificate的意思。

3、將pvk文件和spc文件合成vs能識別的pfx文件

在VS命令行工具里輸入:

pvk2pfx -pvk my.pvk -spc my.spc -pfx my.pfx -pi 123456789 –po 123456789
  • pvk:指定剛才生成的.pvk文件。
  • spc:就是剛才生成的.spc文件。
  • pfx:要生成的.pfx文件的名字。
  • pi:.pvk文件的密碼,即我們前面創建的123456。
  • po:生成的.pfx文件的密碼,你可以重新設,我這里還是用123456,后面在VS導入時會用到這個密碼。

我們也可以使用pvkimprt工具(下載,提取碼:m5ut ),執行以下命令:

pvkimprt -pfx my.spc my.pvk

會彈出一個密碼輸入框,輸入上面創建私鑰時的密碼即可進入向導程序,中間需要注意的是這里,你需要選"是,導出私鑰":

生成pfx文件向導注意事項

跟着向導指示,完成之后,你就得到了pfx文件。

4、將pfx導入項目簽名

回到VS,打開項目屬性窗口,選擇簽名,選擇"從文件選擇",選擇我們上面生成的pfx文件。

導入pfx文件

客戶端安裝證書

打開"控制面板",搜索"證書",找到"管理計算機證書"。你也可以直接在CMD里輸入"certmgr.msc",打開管理界面,如下圖所示:

證書管理界面

將上面創建的cer文件發到客戶端,在"受信任的根證書頒發機構"和下面的"受信任的發布者"中都"右鍵選擇所有任務->導入",根據向導導入我們的證書文件。

這樣之后客戶安裝、更新、卸載我們的程序,就再也不會跳出"應用程序安裝 - 安全警告"了,真正實現ClickOnce,並且我們可以根據我們的實際需要設定證書日期,不會因為一年過期就出現各種不可預知的問題。

參考資料

1、ClickOnce發布時報錯:Cannot publish because a project failed to build

2、Makecert工具使用參數說明

3、你了解HTTPS,但你可能不了解X.509

4、在決定使用ClickOnce發布你的軟件前,應該知道的一些事情

5、ClickOnce部署Winform程序的方方面面

6、啟用"從與我的應用程序相同的位置下載系統必備組件"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM