C#Setup Project Custom Action将安装目录保存到自定义设置文件

时间:2016-07-13 16:24:22

标签: c# windows-installer setup-project custom-action settings.settings

我正在尝试使用Windows安装程序创建一个应用程序,因为它是安装方法。当安装成功时,我想获得我在安装程序中配置的主输出所在的路径。在我的情况下,主要输出位于文件夹[ApplicationData(Installroot)]\Bin\

我的类库中还有一个名为App.Settings的自定义设置文件,它控制多个设置,例如相对于安装位置的文件位置。

所以我的想法是,当安装成功时,它应该调用App.Settings并将安装文件夹保存到设置文件中。

我已经创建了一个Install类并将其放在类库中。我不确定它是否应该在该项目中。 这是Install Class的代码:

using System.Collections;
using System.ComponentModel;

namespace WaspbaneModels
{
    [RunInstaller(true)]
    public partial class Installer : System.Configuration.Install.Installer
    {
        public Installer()
        {
            InitializeComponent();
        }

        public override void Install(IDictionary stateSaver)
        {
            base.Install(stateSaver);
        }

        public override void Commit(IDictionary savedState)
        {
            base.Commit(savedState);

            SettingsControl.BaseURL = Context.Parameters["assemblypath"];
            SettingsControl.Save();
        }

        public override void Rollback(IDictionary savedState)
        {
            base.Rollback(savedState);
        }

        public override void Uninstall(IDictionary savedState)
        {
            base.Uninstall(savedState);
        }
    }
}

在此代码中,SettingsControl是仅使用某些属性来处理“设置”的类。我使用这个类,以便我的Windows窗体项目也可以访问这些设置。

在“自定义操作”选项卡中,我还将主要输出添加到所有内容。我也不确定这是否正确,因为我认为主要输出包含所有.dll文件,包括类库。

我不确定从这一点开始继续,但是因为没有保存设置。我只是通过在应用程序启动时设置一个消息框来检查这一点,并给出设置值。

任何对项目更多数据感兴趣的人都会问。我暂时不会发布所有内容。

编辑:

经过一些测试后,我设法发现没有调用Installer类。我添加了一些东西,当这个方法被调用但没有发生任何事情时会写入文件。

因此我现在的问题是:如何正确地将自定义操作添加到安装项目?

3 个答案:

答案 0 :(得分:2)

您可以将自定义操作类(.dll)添加到安装项目中。您必须将 InstallerActions .dll添加到“安装”和“提交”操作中。

enter image description here

添加自定义操作

  1. 在解决方案资源管理器中选择安装程序安装程序项目。上 单击视图菜单,指向编辑器,然后单击自定义操作。该 将显示“自定义操作编辑器”。
  2. 在自定义操作编辑器中,选择提交节点。关于行动 单击菜单,单击添加自定义操作。
  3. 在“在项目中选择项目”对话框中,双击 应用文件夹。从 InstallerActions 中选择主要输出 项目。 InstallerActions的主要输出显示在 “自定义操作编辑器”中的“提交”节点。
  4. 在“属性”窗口中,确保使用InstallerClass属性 设置为True(这是默认设置)。
  5. 在自定义操作编辑器中,选择安装节点并添加 InstallerActions 的主要输出与此节点相同 提交节点。

答案 1 :(得分:1)

设置范例不适用于安装程序类,因为您不在运行的应用程序上下文中。您是通过使用系统帐户运行的msiexec.exe进程通过反射调用的,没有任何工作目录上下文。人们通常直接在设置文件上使用Xml处理来解决此问题。您需要命名设置文件的完整路径,因为您再次从msiexec.exe进程作为回调运行。

自定义操作不需要是Commit自定义操作,因为所有VS自定义操作在安装所有文件后运行。您需要提交自定义的唯一操作是当您运行的代码依赖于在WinSxS上安装到GAC的文件时,因为它们在提交时间之前无法访问。

答案 2 :(得分:0)

我有同样的问题。经过无奈后,我发现msi安装程序仅在RemovePreviousVersions = true更新期间使用第一次安装时应用程序的安装程序类。因此,如果您卸载该应用程序并重新安装,它将起作用。

作为一种解决方法,我发现在安装过程中卸载早期版本可以解决此问题。必须将RemoveExistingProducts的序列号在msi安装程序documented in SO here中移到较低的值。这可以使用orca手动完成,也可以通过运行here作为VS PostBuildEvent运行vbs脚本来自动完成:

cscript.exe ..\Msi_Fix_RemoveExistingProducts_Record.vbs yourOutput.msi

不幸的是,安装程序类仍需要两次更新才能正确渗透到安装程序中。大概可以通过在msi文件中的RemoveExistingProducts上添加一个更低的序列号来解决此问题,但是我现在已经摆弄了它。