除此之外,我的安装程序类没有什么特别之处。它安装 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。那没有帮助。