EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

vs2022如何嵌套安裝包

首先

首先我的建議是直接是用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=

This article was last edited at 2024-06-14 15:25:02

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.