c# winform 打包部署 自定義介面 或設定開機啟動
方法一:
建立安裝部署這部分就不用說了,新增安裝部署專案後,滑鼠右鍵安裝專案->檢視->登錄檔, 要使軟體在開機就執行,可以在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run中新增鍵值儲存軟體目錄。在這裡我們依次新增以上的項,然後在Run中新增鍵值,鍵名可以自己起,value要填軟體的物理路徑。物理路徑是客戶在部署確定的,我們如何獲取呢?這裡我們可以使用[TARGETDIR]獲取客戶選擇的路徑,在加上軟體的啟動檔名稱。比如軟體啟動檔案的名稱是Client.exe,那麼Value的值就為:[TARGETDIR]Client.exe.生成安裝專案。找到bin目錄下的setup.exe檔案執行,安裝結束後我們可以在登錄檔中找到相應的鍵值。重啟電腦系統就會自動執行我們設定的軟體。
我用的是方法1,可以成功(一開始以為得在local_machine下面的run才可以,現在發現在current_user下面的run也可以)
我發現一個很奇怪的現象,就是假如我在安裝包中是通過在local_machine下面的run所新增程式路徑進來,然後安裝後用系統的登錄檔編輯器來看,會找不到自己所新增的,但是如果重啟一下卻又的確可以自動啟動我的程式,真是奇怪,就好像本來新增成功了的登錄檔啟動項用登錄檔編輯器看不到了
在安裝包製作中,是有新增一項到run裡面的,但是用登錄檔編輯器卻看不到,不過開機啟動依然可以自行啟動我的程式。。。
方法二:
CSDN中使用VS製作安裝程式的介紹很多,我這裡主要是在開發winform是製作安裝程式後,如何修改.config配置檔案,並修改登錄檔HKEY_LOCAL_MACHINE、SOFTWARE\Microsoft\Windows\CurrentVersion\Run下的資訊,讓自己的程式開機自動執行。
解決以上兩個問題關鍵要作到以下幾點:
1、建立安裝專案後要在自己的解決方案是新增一個新的類庫專案(ClassLibrary1),並在新類庫中新增一下安裝程式類(Installer1),在Installer1類中新增如下程式碼:
string LogicDir;//用於讀取安裝目標的物理路徑
protected override void OnAfterInstall(IDictionary savedState)
{
base.OnAfterInstall(savedState);
}
public override void Install(IDictionary stateSaver)
{
//string ll=Context.Parameters[]
LogicDir = Context.Parameters["LogicDir"];//Context.Parameters["LogicDir"];
base.Install(stateSaver);
}
protected override void OnBeforeInstall(IDictionary savedState)
{
base.OnBeforeInstall(savedState);
}
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
}
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
}
2、在庫類專案ClassLibrary1是新增一個window窗體form1,用於完成自定義的安裝配置。
窗體介面自己設計;
如新增三個TextBox
txtServerName伺服器名稱
txtSQLUserName SQL使用者名稱稱
txtSQLUserPassword SQL使用者口令
新增一個Button
給Form1新增欄位 string filePath;
過載Form1的建構函式
public Form1(string filepath)
{
filePath = filepath;
InitializeComponent();
}
Button1的單擊事件程式碼如下:
private void btSave_Click(object sender, EventArgs e)
{
Configuration config = ConfigurationManager.OpenExeConfiguration(filePath + @"\MySchool.exe");
//配置MySchool.exe.config檔案。
if (config.ConnectionStrings.ConnectionStrings["MySchoolConnectionString"] != null)
{
config.ConnectionStrings.ConnectionStrings.Remove("MySchoolConnectionString");
//="Data Source=.;Initial Catalog=MySchool;User ID=sa;Password=123456"
string connString = "Data Source=" + this.txtServerName.Text.Trim();
connString += ";Initial Catalog=MySchool;User ID=" + this.txtSQLUserName.Text.Trim();
connString += ";Password=" + this.txtSQLUserPassword.Text.Trim();
ConnectionStringSettings conn = new ConnectionStringSettings("MySchoolConnectionString"
, connString, "System.Data.SqlClient");
config.ConnectionStrings.ConnectionStrings.Add(conn);
config.Save();
//此處開開始新增開機自動執行的鍵值,注意要using Microsoft.Win32;
RegistryKey hklm = Registry.LocalMachine;
RegistryKey shoftwer = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true);
// RegistryKey ksxt = shoftwer.CreateSubKey("ksxt");
shoftwer.SetValue("ksxt", filePath + @"\MySchool.exe");
Application.Exit();
}
}
3.修改安裝程式類Installer1中的OnAfterInstall方法如下:
Form1 fm1 = new Form1(LogicDir);//例項化一個窗體,
fm1.ShowDialog();//讓新窗體顯示
base.OnAfterInstall(savedState);
4.修改安裝程式類Installer1中的Install方法如下
LogicDir = Context.Parameters["LogicDir"];//讀取安裝目標路徑
base.Install(stateSaver);
5.在安裝專案中“自定義操作”
右擊“安裝”新增自定義操作,自定義操作來源於安裝專案的“應用程式資料夾”中的“主輸出來自ClassLibrary1(活動)”項。
6.修改“主輸出來自ClassLibrary1(活動)”的CustomActionData屬性為 /LogicDir="[TARGETDIR]\"
把Windows Installer 屬性的安裝目標屬性[TARGETDIR]賦值給LogicDir,這樣在Install方法中才能讀取到安裝路徑。
照以上步驟生成解決方案後,即可釋出自己的程式。
用以上思路也可以實現解除安裝輸入合法口令解除安裝的功能。