[转] VS2017 打包安装程序
- 前言
C#寫好一個應(yīng)用程序,總想分享給自己的朋友或者上架,然而被困在打包之外,這次為大家?guī)斫谖业慕?jīng)驗,經(jīng)過幾天的摸索,發(fā)現(xiàn)網(wǎng)上的教程并不全面,會給初學(xué)者帶來很多疑問,這里將做些問題描述與解答。?
/*
開發(fā)工具:Visual Studio 2017?
系統(tǒng)版本:win10 x64?
要求:已經(jīng)有一個已完成的項目?
*/
打開工具->擴展和更新->搜索(2017 installer)->點擊安裝:?
??
這里安裝擴展的具體步驟就不再贅述。?
2. 安裝完擴展以后,新建一個Setup project項目。
界面如下?
“應(yīng)用程序文件夾”即”Application Folder”表示要安裝的應(yīng)用程序需要添加的文件;?
“用戶的‘程序’菜單”即”User’s Programs?
Menu”表示:應(yīng)用程序安裝完,用戶的“開始菜單”中的顯示的內(nèi)容,一般在這個文件夾中,需要再創(chuàng)建一個文件用來存放:應(yīng)用程序.exe和卸載程序.exe;?
“用戶桌面”即”User’s Desktop”表示:這個應(yīng)用程序安裝完,用戶的桌面上的創(chuàng)建的.exe快捷方式。?
3. 解決方案->添加->新建項目->類庫,命名為ClassLibrary,在項目ClassLibrary下面,刪除Class1.cs,添加->新建項目->安裝程序類(名稱為InstallerDemo.cs),打開Installer,這個class Installer繼承自System.Configuration.Install.Installer,里面就一個構(gòu)造函數(shù)?,F(xiàn)在安裝程序不能完成的功能,都可以在這個類寫代碼來自己實現(xiàn)。?
4. 重寫安裝函數(shù)BeforeInstall,AfterInstall,AfterRollback,AfterUninstall,BeforeRollback,BeforeUninstall等復(fù)制以下代碼實現(xiàn)自定義操作:?
ps:這里的OnAfterInstall操作是寫入注冊表,自啟動
實現(xiàn)以上還不能應(yīng)用到你的程序中,接下來添加主程序入口。?
5. 添加主程序入口:“application folder 應(yīng)用程序文件夾”–右側(cè)空白處右鍵–“添加”–“項目輸出”?
**?
項目Setup1 ->添加->項目輸出->選擇ClassLibrary后確定,你會發(fā)現(xiàn),在項目Setup1 下面多了一項“主輸出來自ClassLibrary(活動)”的字樣。?
6. 添加自定義操作: 可以看到四個子項:安裝,提交,回滾,卸載。在安裝上面點擊右鍵->添加自定義操作->選擇“主輸出來自ClassLibrary(活動)”。這樣,重新生成后,安裝之后就會執(zhí)行 OnAfterInstall代碼了。?
?
ps:獲取用戶設(shè)定的安裝目標路徑, 注意,需要在Setup項目里面自定義操作->install->輸出的屬性欄里面的CustomActionData添加上/targetdir=”[TARGETDIR]\”這樣代碼里就可以獲取到安裝路徑了?
7. 添加卸載程序:c:\windows\system32\msiexec.exe?
?
獲取資源管理器”:點擊項目setup1,屬性>-“ProductCode” ,將它的值復(fù)制,后面需要使用,很重要。?
?
8. 添加你的已存在項目文件:debug目錄下的文件添加到應(yīng)用程序文件夾里。?
9. 創(chuàng)建應(yīng)用程序快捷方式,卸載快捷方式.并重命名為你希望的,剪切并黏貼到桌面文件夾和用戶程序文件夾?
?
并在卸載快捷方式的屬性中添加之前復(fù)制的?
最后生成應(yīng)用程序即可。?
至此你的第一個應(yīng)用程序就打包好了?,F(xiàn)在去測試吧!
這個例子中在寫入注冊表時遇到了不少難題,其中一個很迷惑人的就是:?
System.UnauthorizedAccessException: 無法寫入到注冊表項。?
在 System.ThrowHelper.ThrowUnauthorizedAccessException(ExceptionResource resource)?
在 Microsoft.Win32.RegistryKey.EnsureWriteable()?
在 Microsoft.Win32.RegistryKey.SetValue(String name, Object value, RegistryValueKind valueKind)?
在 Microsoft.Win32.RegistryKey.SetValue(String name, Object value)?
在 MyInstall.InstallerBing.OnAfterInstall(IDictionary savedState)?
后來找資料說是未將RegistryKey run = hklm.OpenSubKey(@”SOFTWARE\Microsoft\Windows\CurrentVersion\Run”,true);設(shè)為true,之后解決。
操作注冊表時還有一個問題就是寫入成功,找不到的問題,?
在32位機上自啟動路徑位:計算機\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run?
64位:計算機\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
最后設(shè)置的CustomActionData添加上/targetdir=”[TARGETDIR]\”,一定要寫對?/targetdir=”[TARGETDIR]\”
歡迎大家指出問題。
轉(zhuǎn)載于:https://www.cnblogs.com/z45281625/p/8694278.html
總結(jié)
以上是生活随笔為你收集整理的[转] VS2017 打包安装程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: HCIE论述题
- 下一篇: How to Make An Uimag
