Visual Studio 2017&C#打包應用程式詳細教程,重寫安裝類獲取安裝路徑,附加各種奇葩問題描述
- 前言
C#寫好一個應用程式,總想分享給自己的朋友或者上架,然而被困在打包之外,這次為大家帶來近期我的經驗,經過幾天的摸索,發現網上的教程並不全面,會給初學者帶來很多疑問,這裡將做些問題描述與解答。
/**
開發工具:Visual Studio 2017
系統版本:win10 x64
要求:已經有一個已完成的專案
*/
- 獲取打包工具,使用微軟自帶工具,獲取步驟如下,若已安裝請忽略此步。
開啟工具->擴充套件和更新->搜尋(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