使用自定义操作的Visual Studio 2010 MSI项目和Service Installer类

时间:2012-06-08 01:11:37

标签: visual-studio-2010 windows-services installer windows-installer

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

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

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

变量:

  • 在A上,我使用的是EDITA1,其余部分是隐形的
  • 在B上,我正在使用EDITB1,其余部分是不可见的
  • 在C上,我正在使用EDITC1,其余部分是不可见的

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

  • 参数:空白
  • 条件:空白
  • CustomActionData:/ MYPARAM1 = [EDITA1] / MYPARAM2 = [EDITB1] / MYPARAM3 = [EDITC1]
  • InstallerClass:True

在安装程序类中,重写安装

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。这没有用。

1 个答案:

答案 0 :(得分:1)

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

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