1

除此之外,我的安装程序类没有什么特别之处。它安装 Windows 服务。但是现在我需要提示用户一些信息并将信息传递给安装程序类,以便安装程序类可以更新 app.config。

我在默认用户界面中添加了三个额外的页面:

  • 文本框 (A)
  • 文本框 (B)
  • 文本框 (C)

变量:

  • 在A上,我用的是EDITA1,其余的都是不可见的
  • 在 B 上,我使用的是 EDITB1,其余的都是不可见的
  • 在 C 上,我使用的是 EDITC1,其余的都是不可见的

在“安装”自定义操作中,我的属性设置如下:

  • 参数:空白
  • 条件:空白
  • CustomActionData: /MYPARAM1=[EDITA1] /MYPARAM2=[EDITB1] /MYPARAM3=[EDITC1]
  • 安装程序类:真

在安装程序类中,Install 被覆盖

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

    // This is to display the Parameters
    // It comes up blank.  No Parameters.
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    foreach (string s in Context.Parameters.Keys)
    {
        sb.Append(s);
        sb.Append(":");
        sb.AppendLine(Context.Parameters[s]);
    }
    //throw new InstallException(sb.ToString());

    //This returns TRUE.
    //throw new InstallException(Context.Parameters.ContainsKey("MYPARAM1").ToString());

    string x= Context.Parameters["MYPARAM1"];
    if (string.IsNullOrEmpty(x))
    {
        throw new InstallException("Missing parameter 'MYPARAM1'");
    }

    <snip>
}

当应用程序运行时,MYPARAM1 为空,所以最后我看到了 InstallException。

我在安装的顶部添加了两块测试代码。首先,创建一个字符串,其中包含应该在命令行中输入的所有参数。我根本没有得到我的参数。第二个块报告“TRUE”——这意味着键“MYPARAM1”在命令行上。第一个和第二个块不同意。怎么会这样?

作为实验,我尝试将字符串更改为 /MYPARAM1 而不是 MYPARAM1。那没有帮助。

4

1 回答 1

1

第一步是创建一个详细日志以查看传递给您的自定义操作的完整命令行。创建日志的命令:msiexec /i "C:\MyPackage\Example.msi" /L*V "C:\log\example.log"

在日志中,您可以搜索属性名称以查看它们是否被正确设置并被传递给您的自定义操作。

于 2012-06-08T12:09:40.237 回答