1. 程式人生 > >Visual Studio 2017&C#打包應用程式詳細教程,重寫安裝類獲取安裝路徑,附加各種奇葩問題描述

Visual Studio 2017&C#打包應用程式詳細教程,重寫安裝類獲取安裝路徑,附加各種奇葩問題描述

  • 前言

C#寫好一個應用程式,總想分享給自己的朋友或者上架,然而被困在打包之外,這次為大家帶來近期我的經驗,經過幾天的摸索,發現網上的教程並不全面,會給初學者帶來很多疑問,這裡將做些問題描述與解答。
/**
開發工具:Visual Studio 2017
系統版本:win10 x64
要求:已經有一個已完成的專案
*/

  1. 獲取打包工具,使用微軟自帶工具,獲取步驟如下,若已安裝請忽略此步。

開啟工具->擴充套件和更新->搜尋(2017 installer)->點選安裝:
開啟工具->擴充套件和更新 這裡寫圖片描述
這裡安裝擴充套件的具體步驟就不再贅述。
2. 安裝完擴充套件以後,新建一個Setup project專案。

這裡寫圖片描述介面如下
“應用程式資料夾”即”Application Folder”表示要安裝的應用程式需要新增的檔案;
“使用者的‘程式’選單”即”User’s Programs
Menu”表示:應用程式安裝完,使用者的“開始選單”中的顯示的內容,一般在這個資料夾中,需要再建立一個檔案用來存放:應用程式.exe和解除安裝程式.exe;
“使用者桌面”即”User’s Desktop”表示:這個應用程式安裝完,使用者的桌面上的建立的.exe快捷方式。
3. 解決方案->新增->新建專案->類庫,命名為ClassLibrary,在專案ClassLibrary下面,刪除Class1.cs,新增->新建專案->安裝程式類(名稱為InstallerDemo.cs),開啟Installer,這個class Installer繼承自System.Configuration.Install.Installer,裡面就一個建構函式。現在安裝程式不能完成的功能,都可以在這個類寫程式碼來自己實現。
4. 重寫安裝函式BeforeInstall,AfterInstall,AfterRollback,AfterUninstall,BeforeRollback,BeforeUninstall等複製以下程式碼實現自定義操作:


ps:這裡的OnAfterInstall操作是寫入登錄檔,自啟動

protected override void OnAfterInstall(IDictionary savedState)
        {
            LogWrite("OnAfterInstall!");
            string path = this.Context.Parameters["targetdir"];//獲取使用者設定的安裝目標路徑, 注意,需要在Setup專案裡面自定義操作的屬性欄裡面的CustomActionData新增上/targetdir="[TARGETDIR]\"
LogWrite(path); //開機啟動 RegistryKey hklm = Registry.LocalMachine; RegistryKey run = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true); try {//64位系統在計算機\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run LogWrite("設定登錄檔!"); LogWrite(path.Substring(0, path.Length - 1) + @"BingPic\BingPic.exe"); run.CreateSubKey("Bing",true); run.SetValue("Bing", path.Substring(0,path.Length-1) + @"BingPic\BingPic.exe"); hklm.Close(); LogWrite("設定結束!"); } catch (Exception my) { my.ToString(); LogWrite(my.ToString()); } base.OnAfterInstall(savedState); } public override void Install(IDictionary stateSaver) { LogWrite("Install!"); base.Install(stateSaver); } protected override void OnBeforeInstall(IDictionary savedState) { LogWrite("OnBeforeInstall!"); base.OnBeforeInstall(savedState); } public override void Uninstall(IDictionary savedState) { LogWrite("Uninstall!"); base.Uninstall(savedState); } public override void Rollback(IDictionary savedState) { LogWrite("Rollback"); base.Rollback(savedState); } public void LogWrite(string str) { string LogPath = @"c:\log\"; using (System.IO.StreamWriter sw = new System.IO.StreamWriter(LogPath + @"SetUpLog.txt", true)) { sw.WriteLine(DateTime.Now.ToString("[yyyy-MM-dd HH:mm:ss] ") + str + "\n"); } }

實現以上還不能應用到你的程式中,接下來新增主程式入口。
5. 新增主程式入口:“application folder 應用程式資料夾”–右側空白處右鍵–“新增”–“專案輸出”
**這裡寫圖片描述
專案Setup1 ->新增->專案輸出->選擇ClassLibrary後確定,你會發現,在專案Setup1 下面多了一項“主輸出來自ClassLibrary(活動)”的字樣。這裡寫圖片描述
6. 新增自定義操作: 可以看到四個子項:安裝,提交,回滾,解除安裝。在安裝上面點選右鍵->新增自定義操作->選擇“主輸出來自ClassLibrary(活動)”。這樣,重新生成後,安裝之後就會執行 OnAfterInstall程式碼了。
這裡寫圖片描述這裡寫圖片描述
ps:獲取使用者設定的安裝目標路徑, 注意,需要在Setup專案裡面自定義操作->install->輸出的屬性欄裡面的CustomActionData新增上/targetdir=”[TARGETDIR]\”這裡寫圖片描述這樣程式碼裡就可以獲取到安裝路徑了
7. 新增解除安裝程式:c:\windows\system32\msiexec.exe
這裡寫圖片描述
獲取資源管理器”:點選專案setup1,屬性>-“ProductCode” ,將它的值複製,後面需要使用,很重要。
這裡寫圖片描述
8. 新增你的已存在專案檔案:debug目錄下的檔案新增到應用程式資料夾裡。這裡寫圖片描述
9. 建立應用程式快捷方式,解除安裝快捷方式.並重命名為你希望的,剪下並黏貼到桌面資料夾和使用者程式資料夾這裡寫圖片描述這裡寫圖片描述
這裡寫圖片描述這裡寫圖片描述
並在解除安裝快捷方式的屬性中新增之前複製的欄位
最後生成應用程式即可。這裡寫圖片描述
至此你的第一個應用程式就打包好了。這裡寫圖片描述這裡寫圖片描述現在去測試吧!

這個例子中在寫入登錄檔時遇到了不少難題,其中一個很迷惑人的就是:
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);設為true,之後解決。

操作登錄檔時還有一個問題就是寫入成功,找不到的問題,
在32位機上自啟動路徑位:計算機\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
64位:計算機\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run

最後設定的CustomActionData新增上/targetdir=”[TARGETDIR]\”,一定要寫對 /targetdir=”[TARGETDIR]\”

歡迎大家指出問題。

相關推薦

Visual Studio 2017&C#打包應用程式詳細教程重寫安裝獲取安裝路徑附加各種奇葩問題描述

前言 C#寫好一個應用程式,總想分享給自己的朋友或者上架,然而被困在打包之外,這次為大家帶來近期我的經驗,經過幾天的摸索,發現網上的教程並不全面,會給初學者帶來很多疑問,這裡將做些問題描述與解答。 /** 開發工具:Visual Studio 2017

使用Visual Studio Installer 2015打包WPF程式

前言 做過WPF專案,就少不了要將程式打包部署到客戶現場,因為一般長時間不會更新打包程式,每次變動較大需要重新配置打包程式時,就會有些生疏,不那麼得心應手。為了方便記憶,記錄到部落格中。 準備 因為做過的專案都是用VS2015編寫的,所以選擇網上使用較多的Visual Studio Installer201

終於等到你最強 IDE Visual Studio 2017 正式版釋出(附詳細介紹與下載地址)

Visual Studio 2017 正式版釋出,該版本不僅添加了實時單元測試、實時架構依賴關係驗證等新特性,還對許多實用功能進行了改進,如程式碼導航、IntelliSense、重構、程式碼修復和除錯等等。無論使用哪種語言或平臺,都能節省開發者在日常任務上花費的時

Arduino 高階教程 02:用 Visual Studio 2015 開發 Arduino 應用程式(一)

Arduino IDE 的缺點 雖然 Arduino 很流行很火爆,但是 Arduino IDE 卻非常、非常、非常弱。編寫程式碼很不方便,只能說提供了一個最基本的寫程式碼的工具而已,除錯程式碼也很不方便。而且,Arduino IDE 中寫程式碼,只能是把

Visual Studio 2017打包exe安裝文件

soft 便在 ins war 工具 http logs 生成 分享圖片 註意:閱讀本篇文章前,請先按照 https://www.cnblogs.com/DonetRen/p/9890268.html 的步驟添加相應擴展,並創建安裝項目 創建完Windows安裝項目之後,

Visual Studio 2017打包winfrom桌面程式

    由於專案開發需求,需要將winfrom程式打包為安裝程式,之前特地從網上搜過相關教程,但只是教授了簡單的打包流程,並沒有教授如何把相關檔案進行一併打包,導致最後程式出現問題。在請教師兄之後,才瞭解了詳細的打包過程。       

Microsoft Visual Studio 2017 編寫C語言程式

最新版的Visual Studio 2017在新建項上有改變,接下來介紹最新版本如何編寫C語言程式。 1. 檔案>>新建>>專案 a) 左邊選擇Visual C++下的Windows桌面選項,然後選擇Windows桌面嚮導。 b) 在名稱

使用Visual Studio 2017 建立第一個Python web應用程式

一:建立一個Web Project 開啟 Open Visual Studio 2017 軟體 , 如下圖 在主介面選擇File->New->Project 在“新建專案”對話方塊中,選擇Installed下面的Python下的Web,

visual studio 2017 初步編寫C++程式必須的單個元件列表

vc使用C++必備元件 1. .net 2. 編譯器生成工具和執行時 C#和Visual Basic Roslyn編譯器 MSBuild VC++2017 v141工具集 Windows 通用CRT SDK 3. 程式碼工具 靜態分析

Visual studio 2017 Community 安裝 for MFC桌面應用程式

1、下載地址:https://www.visualstudio.com 因為選擇的是Community社群版本,因此直接從官網選擇下載。 下載後文件為 vs_Community.exe , 此檔案為 Visual studio 2017 Community  線上安裝檔案

Microsoft Visual Studio 2017:第一個C++程式的建立及執行

VS2017用的比較少,以防忘記怎麼用,就寫寫步驟 1 新建      1.1 選單欄:檔案 –> 新建 –>專案,如圖: 1.2 如圖,選擇Visual C++,接著選擇空專案,然後修改專案名稱和專案路徑,在選確定 1.3 在右側面板中可

Visual Studio 2017再現C語言經典例題(一)

字母轉 密碼 .com 程序 visual http 。。 其中 com 1、編寫一個程序,輸入a、b、c這3個值,輸出其中最大者。 2、將“China”譯成密碼。密碼規律:用原來的字母後面第4個字母代替原來的字母。例如,字母A後面第4個字母是E,用E代替A,因此,C

C語言: 從 CodeBlocks 到 Microsoft Visual Studio 2017

from comm mem more class c語言 交互 cau auth   開學到現在寒假,學習了一個學期的C語言,同時也已然用了大半年的 CodeBlocks 來寫 C/C++ 程序。CodeBlocks 是寫 C/C++ 語言的程序最輕量的IDE(集成開發

Visual Studio 2017.NET(C#)通過Oracle.ManagedDataAccess來連接Oracle數據庫

成了 lin cnblogs img 輸入 cli acl 程序 選擇 C#如何通過Oracle.ManagedDataAccess來連接Oracle數據庫 1、先創建一個項目,鼠標右擊項目中的引用,再點擊管理NuGet程序包(也可以先下載dll文件,再選添加引用),在搜索

Visual Studio 2017 安裝使用教程詳細版)

系統設置 -s 分享圖片 代碼 ++ 官網下載 studio 題解 微軟官網 Visual Studio 2017 安裝使用教程(詳細) 本人曾因無法使用vs編寫C語言程序痛苦一個月之久,實乃慚愧,後發現不少同學也同樣存在著相同問題,其原因歸結於網上的各種教程

visual studio 2017 installer 安裝包製作過程出現的問題---此安裝程式需要.NET Framework 版本 3.5安裝該版本然後重新執行此安裝程式可以從Web獲得

visual studio 2017 installer 安裝包製作過程出現的問題---此安裝程式需要.NET Framework 版本 3.5,請安裝該版本,然後重新執行此安裝程式,可以從Web獲得.NET Framework 。要立即做此事嗎?     &nbs

解決Visual Studio 2017執行程式一閃而過的方法

方法一:在編輯程式末尾增加輸入語句:cin.get();,這樣程式執行結束前會要求使用者輸入字元(或回車鍵亦可關閉視窗),未輸入前控制檯就會保持存在,具體程式碼如下圖所示    方法二:在編輯程式末尾新增語句:system("pause");  加上這句後,控制

C++:環境配置 【visual Studio 2017 + Opencv 3】

當新建C++專案,一用到opencv庫函式的時候,就得配置,次次配,不如就寫個教程,怕下次又忘了……   一 opencv安裝,環境變數設定     從官網下載opencv,解壓即可。我這裡用的是opencv3,(安裝路徑  eg:“ D:\ope

使用Visual Studio 2017開發Python程式(2)

建立第一個Hello Word程式 (1)開啟Microsoft Visual Studio 2017,依次單擊頂部工具欄中的“檔案”>“新建” >“專案”命令,彈出“新建專案”對話方塊。在左側模板列表中選擇“Python”選項,在右側選擇“Python應用程式”選項。在下方文字

OpenCV 在C#下的版本EmguCV 3.3.0在Visual Studio 2017 下的安裝除錯

Emgu CV是基於opencv的庫在C# 下再次封裝的庫。可以方便的在C#下除錯。 第一次執行發現不是一次成功,在此記錄除錯方法,供日後參考。 按照其官網文件說明,安裝後,找到Emgu\emgucv-windesktop 3.3.0.2824\Solution\Windows.De