1. 程式人生 > >c# winform 打包部署 自定義介面 或設定開機啟動

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方法中才能讀取到安裝路徑。

照以上步驟生成解決方案後,即可釋出自己的程式。

用以上思路也可以實現解除安裝輸入合法口令解除安裝的功能。