Installer自定义安装类

本文档介绍了如何在 .NET Framework 中创建自定义安装类,包括继承Installer类、重写核心方法,以及如何处理安装、提交、回滚和卸载操作。讨论了InstallUtil.exe的使用,并强调了在安装过程中正确管理状态的重要性,如使用IDictionary来保存和恢复系统状态。还提到了Installer.Context属性在提供安装信息方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是 .NET Framework 中所有自定义安装程序的基类。安装程序是帮助在计算机上安装应用程序的组件。

使用 Installer 时必须遵循几个步骤。

  • 继承 Installer 类。

  • 重写 InstallCommitRollbackUninstall 方法。

  • 向派生类添加 RunInstallerAttribute,并将其设置为 true

  • 将派生类放置在带有要安装的应用程序的程序集内。

  • 调用安装程序。例如,使用 InstallUtil.exe 调用安装程序。

Installers 属性包含安装程序的集合。如果 Installer 的此实例是安装程序集合的一部分,则 Parent 属性设置为包含该集合的 Installer 实例。有关 Installers 集合用法的示例,请参见 AssemblyInstaller 类。

Installer 类的 InstallCommitRollbackUninstall 方法遍历存储在 Installers 属性中的安装程序的集合,并调用每个安装程序的相应方法。

InstallCommitRollbackUninstall 方法并非总是在同一 Installer 实例上调用。例如,在安装和提交应用程序时可能使用一个 Installer 实例,然后释放对该实例的引用。以后卸载应用程序时将创建对新的 Installer 实例的引用,这意味着由 Installer 的另一个实例调用 Uninstall 方法。因此,在派生类中,不要在安装程序中保存计算机的状态。而请使用 IDictionary,它可跨调用保留并传递给 InstallCommitRollbackUninstall 方法。

两种情况可以阐释在状态保护程序 IDictionary 中保存信息的必要性。第一种情况,假定安装程序设置了注册表项。它应在 IDictionary 中保存该项的原始值。如果安装被回滚,则可以还原原始值。第二种情况,假定安装程序替换现有文件。将现有文件保存在临时目录中,并将该文件的新位置的位置保存在 IDictionary 中。如果安装被回滚,则删除新文件并将其替换为临时位置中的原始文件。

Installer.Context 属性包含关于安装的信息。例如,关于安装日志文件位置的信息,Uninstall 方法所要求的保存文件的位置的信息,以及运行安装可执行文件时输入的命令行。

示例

下面的示例说明如何使用 Installer 类。它创建从 Installer 继承的类。当 Commit 将要完成时,发生 Committing 事件并显示一则消息。

using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;

// Set 'RunInstaller' attribute to true.
[RunInstaller(true)]
public class MyInstallerClass: Installer
{
   public MyInstallerClass() :base()
   {
      // Attach the 'Committed' event.
      this.Committed += new InstallEventHandler(MyInstaller_Committed);
      // Attach the 'Committing' event.
      this.Committing += new InstallEventHandler(MyInstaller_Committing);

   }
   // Event handler for 'Committing' event.
   private void MyInstaller_Committing(object sender, InstallEventArgs e)
   {
      Console.WriteLine("");
      Console.WriteLine("Committing Event occured.");
      Console.WriteLine("");
   }
   // Event handler for 'Committed' event.
   private void MyInstaller_Committed(object sender, InstallEventArgs e)
   {
      Console.WriteLine("");
      Console.WriteLine("Committed Event occured.");
      Console.WriteLine("");
   }
   // Override the 'Install' method.
   public override void Install(IDictionary savedState)
   {
      base.Install(savedState);
   }
   // Override the 'Commit' method.
   public override void Commit(IDictionary savedState)
   {
      base.Commit(savedState);
   }
   // Override the 'Rollback' method.
   public override void Rollback(IDictionary savedState)
   {
      base.Rollback(savedState);
   }
   public static void Main()
   {
      Console.WriteLine("Usage : installutil.exe Installer.exe ");
   }
}

J#
import System.*;
import System.Collections.*;
import System.ComponentModel.*;
import System.Configuration.Install.*;

// Set 'RunInstaller' attribute to true.
/** @attribute RunInstaller(true)
 */
public class MyInstallerClass extends Installer
{
    public MyInstallerClass()
    {
        // Attach the 'Committed' event.
        this.add_Committed(new InstallEventHandler(MyInstaller_Committed));

        // Attach the 'Committing' event.
        this.add_Committing(new InstallEventHandler(MyInstaller_Committing));
    } //MyInstallerClass

    // Event handler for 'Committing' event.
    private void MyInstaller_Committing(Object sender, InstallEventArgs e)
    {
        Console.WriteLine("");
        Console.WriteLine("Committing Event occured.");
        Console.WriteLine("");
    } //MyInstaller_Committing

    // Event handler for 'Committed' event.
    private void MyInstaller_Committed(Object sender, InstallEventArgs e)
    {
        Console.WriteLine("");
        Console.WriteLine("Committed Event occured.");
        Console.WriteLine("");
    } //MyInstaller_Committed

    // Override the 'Install' method.
    public void Install(IDictionary savedState)
    {
        super.Install(savedState);
    } //Install

    // Override the 'Commit' method.
    public void Commit(IDictionary savedState)
    {
        super.Commit(savedState);
    } //Commit

    // Override the 'Rollback' method.
    public void Rollback(IDictionary savedState)
    {
        super.Rollback(savedState);
    } //Rollback

    public static void main(String[] args)
    {
        Console.WriteLine("Usage : installutil.exe Installer.exe ");
    } //main
} //MyInstallerClass

线程安全

此类型的任何公共静态(Visual Basic 中的 Shared)成员都是线程安全的,但不保证所有实例成员都是线程安全的。
平台

Windows 98, Windows Server 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

 

Windows Vista、Microsoft Windows XP SP2 和 Windows Server 2003 SP1 支持 Microsoft .NET Framework 3.0。

版本信息

.NET Framework
受以下版本支持:3.0、2.0、1.1、1.0
要实现C++程序的Windows Installer自定义安装路径,你需要在创建安装程序的过程中进行以下步骤: 1. 打开Visual Studio,创建一个新的安装程序项目(InstallShield或WiX)。 2. 在项目中添加一个自定义安装路径的对话框。 3. 在对话框中添加一个文本框和一个“浏览”按钮。 4. 在安装程序脚本中添加代码,以便在用户选择自定义安装路径时将其保存到一个变量中。 5. 在安装程序脚本中使用该变量,以便在安装程序过程中将程序文件复制到用户选择的自定义安装路径。 下面是一些具体的步骤: 1. 在Visual Studio中创建一个新的安装程序项目,如InstallShield或WiX。 2. 在安装程序项目中,找到并打开“用户界面”或“UI”部分。 3. 在用户界面中,添加一个新的对话框,命名为“CustomPathDlg”(或其他您选择的名称)。 4. 在“CustomPathDlg”对话框中,添加一个文本框和一个“浏览”按钮。 5. 右键单击文本框,选择“属性”,并将其名称设置为“EDIT_INSTALLPATH”(或其他您选择的名称)。 6. 右键单击“浏览”按钮,选择“属性”,并将其名称设置为“PUSH_INSTALLPATHBROWSE”(或其他您选择的名称)。 7. 在“CustomPathDlg”对话框上右键单击,选择“属性”,并在“属性”窗口中选择“ControlCondition”属性。 8. 在“ControlCondition”属性中,添加以下代码: EDIT_INSTALLPATH <> "" 9. 在安装程序项目中找到“InstallScript”或“CustomAction”部分。 10. 在该部分中,添加以下代码: // 定义变量 STRING szCustomPath; // 获取自定义路径 MsiGetProperty(hInstall, "EDIT_INSTALLPATH", szCustomPath, 255, NULL); // 保存自定义路径 MsiSetProperty(hInstall, "CUSTOM_INSTALL_PATH", szCustomPath); 11. 在安装程序项目中找到“InstallExecuteSequence”部分。 12. 在该部分中,找到“InstallFiles”操作,并在该操作之前添加以下代码: // 获取自定义路径 MsiGetProperty(hInstall, "CUSTOM_INSTALL_PATH", szCustomPath, 255, NULL); // 设置安装路径 MsiSetTargetPath(hInstall, "INSTALLDIR", szCustomPath); 在执行安装程序时,用户将会看到一个新的对话框,其中包含一个文本框和一个“浏览”按钮,以便选择自定义安装路径。用户选择路径后,安装程序将会将路径保存到一个变量中,并在安装程序过程中将程序文件复制到该路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值