2

我对 Wix 和 wix# 完全陌生,我正在尝试在安装完成后更新 app.config。我可以通过使用 Wix Util 扩展来实现它util:XmlFile,但我希望它由 wix# 完成 CustomDialog UI

下面是我尝试过的代码

var project = new ManagedProject("MyProduct",
                             new Dir(@"%ProgramFiles%\My Company\My Product",
                                 new File("Program.cs"),
                                 new File(@"myPath\App.config")),
                              new ElevatedManagedAction(CustomActions.OnInstall, Return.check, When.After, Step.InstallFiles, Condition.NOT_Installed)
                              {
                                  UsesProperties = "CONFIG_FILE=[INSTALLDIR]App.config"
                              });

        project.Load += Msi_Load;
        project.BeforeInstall += Msi_BeforeInstall;
        project.AfterInstall += Msi_AfterInstall;

在 next 之后创建了一个CustomDialog并将其值设置为会话变量

void next_Click(object sender, EventArgs e)
    {
        MsiRuntime.Session["NAME"] = name.Text;
        Shell.GoNext();
    }

我能够在其中检索会话值,Msi_BeforeInstall但是这里 app.config 路径正在变为 null,因为它没有被复制到INSTALLDIR,当我尝试在Msi_AfterInstall这里执行它时,我没有得到会话变量属性

我也尝试在安装后通过 CustomAction 来做到这一点

 [CustomAction]
    public static ActionResult OnInstall(Session session)
    {

        return session.HandleErrors(() =>
        {
            string configFile = session.Property("INSTALLDIR") + "App.config";
            string userName = session.Property("NAME");
            UpdateAsAppConfig(configFile, userName);
        });
    }
    static public void UpdateAsAppConfig(string configFile,string name)
    {
        var config = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = configFile }, ConfigurationUserLevel.None);

        config.AppSettings.Settings["MyName"].Value = name;

        config.Save();
    }

但没有获得会话变量属性。我真的很陌生,任何帮助将不胜感激。如果我做错了,或者安装后如何更新我的 app.config,请帮助我。

谢谢。

4

1 回答 1

0

我知道您的问题,AfterInstall事件适用于死会话,此时无法访问。如果您在AfterInstall时刻需要一些属性,您可以使用SetupEventArgs.Data属性:

    private void OnBeforeInstall(SetupEventArgs arguments)
    {
        //....
        arguments.Data["MyName"] = arguments.Session["MyName"];
    }

    private void OnAfterInstall(SetupEventArgs arguments)
    {
        var propertyValue = arguments.Data["MyName"];
    }

Data 属性也可用于在 ProgressBarForm 之后显示的 UI 表单中。希望对您有所帮助,让我知道您的反馈。

于 2020-04-23T18:49:26.353 回答