首先
首先我的建議是直接是用Setup Wizard Project
有幾個注意事項,如果你想要加入用戶自定義操作,則必須寫類庫。
這些類必須繼承Installer,比如:
using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
[RunInstaller(true)]
public partial class CustomActions : Installer
{
//這裏是你重寫的方法
}
這個是在Commit的時候執行的方法。其它的還有:
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
// 在這裏添加自定義安裝邏輯
}
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
// 在這裏添加自定義回滾邏輯
}
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
// 在這裏添加自定義卸載邏輯
}
protected override void OnBeforeInstall(IDictionary savedState)
{
base.OnBeforeInstall(savedState);
// 在這裏添加安裝前的邏輯
}
protected override void OnAfterInstall(IDictionary savedState)
{
base.OnAfterInstall(savedState);
// 在這裏添加安裝後的邏輯
}
protected override void OnBeforeUninstall(IDictionary savedState)
{
base.OnBeforeUninstall(savedState);
// 在這裏添加卸載前的邏輯
}
protected override void OnAfterUninstall(IDictionary savedState)
{
base.OnAfterUninstall(savedState);
// 在這裏添加卸載後的邏輯
}
方法
- Install(IDictionary stateSaver): 安裝操作。
- Commit(IDictionary savedState): 提交操作。
- Rollback(IDictionary savedState): 回滾操作。
- Uninstall(IDictionary savedState): 卸載操作。
- OnBeforeInstall(IDictionary savedState): 安裝之前的操作。
- OnAfterInstall(IDictionary savedState): 安裝之後的操作。
- OnBeforeRollback(IDictionary savedState): 回滾之前的操作。
- OnAfterRollback(IDictionary savedState): 回滾之後的操作。
- OnBeforeCommit(IDictionary savedState): 提交之前的操作。
- OnAfterCommit(IDictionary savedState): 提交之後的操作。
- OnBeforeUninstall(IDictionary savedState): 卸載之前的操作。
- OnAfterUninstall(IDictionary savedState): 卸載之後的操作。
方法參數
IDictionary savedState
這個參數是安裝過程中保存狀態信息的字典,用於方法如 Install, Commit, Rollback, 和 Uninstall。這些方法的簽名必須包含這個參數,以便在安裝過程的不同階段保存和訪問狀態信息。
base.Install(stateSaver);
在 Install 方法中,您應該始終使用 stateSaver 作為參數,而不應該使用 savedState。相應地,在 Commit 和 Rollback 方法中,應該使用 savedState 作為參數。
base.Commit(savedState);
方法和參數示例
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver); // 正確的寫法
// 保存安裝狀態信息
stateSaver["InstallDate"] = DateTime.Now;
stateSaver["InstalledFiles"] = new List<string> { "file1.txt", "file2.txt" };
}
public override void Commit(IDictionary savedState)
{
base.Commit(savedState); // 正確的寫法
// 使用保存的狀態信息
if (savedState.Contains("InstallDate"))
{
DateTime installDate = (DateTime)savedState["InstallDate"];
Debug.WriteLine($"Installation Date: {installDate}");
}
}
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState); // 正確的寫法
// 使用保存的狀態信息
if (savedState.Contains("InstalledFiles"))
{
List<string> installedFiles = (List<string>)savedState["InstalledFiles"];
foreach (string file in installedFiles)
{
Debug.WriteLine($"Rollback file: {file}");
// 執行文件回滾邏輯
}
}
}
事件訂閲
除了重寫方法,還有事件訂閲的方法:
using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
[RunInstaller(true)]
public partial class CustomActions : Installer
{
public CustomActions()
{
// 訂閱事件
this.BeforeInstall += new InstallEventHandler(CustomActions_BeforeInstall);
this.AfterInstall += new InstallEventHandler(CustomActions_AfterInstall);
this.BeforeRollback += new InstallEventHandler(CustomActions_BeforeRollback);
this.AfterRollback += new InstallEventHandler(CustomActions_AfterRollback);
this.BeforeCommit += new InstallEventHandler(CustomActions_BeforeCommit);
this.AfterCommit += new InstallEventHandler(CustomActions_AfterCommit);
this.BeforeUninstall += new InstallEventHandler(CustomActions_BeforeUninstall);
this.AfterUninstall += new InstallEventHandler(CustomActions_AfterUninstall);
}
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
// 在這裡添加自定義安裝邏輯
}
public override void Commit(IDictionary savedState)
{
base.Commit(savedState);
// 在這裡添加自定義提交邏輯
}
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
// 在這裡添加自定義回滾邏輯
}
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
// 在這裡添加自定義卸載邏輯
}
protected override void OnBeforeInstall(IDictionary savedState)
{
base.OnBeforeInstall(savedState);
// 在這裡添加安裝前的邏輯
}
protected override void OnAfterInstall(IDictionary savedState)
{
base.OnAfterInstall(savedState);
// 在這裡添加安裝後的邏輯
}
protected override void OnBeforeRollback(IDictionary savedState)
{
base.OnBeforeRollback(savedState);
// 在這裡添加回滾前的邏輯
}
protected override void OnAfterRollback(IDictionary savedState)
{
base.OnAfterRollback(savedState);
// 在這裡添加回滾後的邏輯
}
protected override void OnBeforeCommit(IDictionary savedState)
{
base.OnBeforeCommit(savedState);
// 在這裡添加提交前的邏輯
}
protected override void OnAfterCommit(IDictionary savedState)
{
base.OnAfterCommit(savedState);
// 在這裡添加提交後的邏輯
}
protected override void OnBeforeUninstall(IDictionary savedState)
{
base.OnBeforeUninstall(savedState);
// 在這裡添加卸載前的邏輯
}
protected override void OnAfterUninstall(IDictionary savedState)
{
base.OnAfterUninstall(savedState);
// 在這裡添加卸載後的邏輯
}
private void CustomActions_BeforeInstall(object sender, InstallEventArgs e)
{
// 在這裡添加安裝前的邏輯
}
private void CustomActions_AfterInstall(object sender, InstallEventArgs e)
{
// 在這裡添加安裝後的邏輯
}
private void CustomActions_BeforeRollback(object sender, InstallEventArgs e)
{
// 在這裡添加回滾前的邏輯
}
private void CustomActions_AfterRollback(object sender, InstallEventArgs e)
{
// 在這裡添加回滾後的邏輯
}
private void CustomActions_BeforeCommit(object sender, InstallEventArgs e)
{
// 在這裡添加提交前的邏輯
}
private void CustomActions_AfterCommit(object sender, InstallEventArgs e)
{
// 在這裡添加提交後的邏輯
}
private void CustomActions_BeforeUninstall(object sender, InstallEventArgs e)
{
// 在這裡添加卸載前的邏輯
}
private void CustomActions_AfterUninstall(object sender, InstallEventArgs e)
{
// 在這裡添加卸載後的邏輯
}
}
事件處理程序參數
object sender
這個參數代表觸發事件的對象。
在事件處理程序中,這個參數是固定的,並且允許您訪問觸發事件的對象。
InstallEventArgs e
這個參數提供與安裝事件相關的數據。
InstallEventArgs 是 EventArgs 的子類,用於傳遞安裝過程中的事件數據。
關於CustomActionData的參數
在自定義動作表示畫面裏,當拖入自己寫好的dll時,可能需要你寫入CustomActionData的參數(這取決你需不需要讀取安裝畫面的部分空間的值)。
當使用
/InstallAccessEngine=[CHECKBOXA1]
這類命令行參數時,有些部分是您可以自定義命名的,而有些部分是規定好的格式。
總結
- 自定義命名:InstallAccessEngine(後臺寫好的參數), CHECKBOXA1(窗體上的默認控件的名字,自己可在VS的屬性框修改)
- 規定好的格式:[], /InstallAccessEngine=
Today's comments have reached the limit. If you want to comment, please wait until tomorrow (UTC-Time).
There is 18h50m50s left until you can comment.