1

これ以外は、私のインストーラークラスは特別なものではありません。Windowsサービスをインストールします。しかし、インストーラークラスがapp.configを更新できるように、ユーザーに情報の入力を求め、その情報をインストーラークラスに渡す必要があります。

デフォルトのユーザーインターフェイスに3つのページを追加しました。

  • テキストボックス(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が表示されます。

インストールの先頭にテストコードの2つのチャンクを追加しました。1つ目は、コマンドラインに入力する必要のあるすべてのパラメーターを含む文字列を作成します。パラメータがまったく取得されません。2番目のチャンクは「TRUE」を報告します。これは、キー「MYPARAM1」がコマンドラインにあったことを意味します。最初と2番目のチャンクは一致しません。どうすればいいの?

実験として、文字列をMYPARAM1ではな​​く/MYPARAM1に変更してみました。それは役に立ちませんでした。

4

1 に答える 1

1

最初のステップは、詳細ログを作成して、カスタム アクションに渡された完全なコマンド ラインを確認することです。ログを作成するコマンド:msiexec /i "C:\MyPackage\Example.msi" /L*V "C:\log\example.log"

ログでプロパティ名を検索して、それらが正しく設定され、カスタム アクションに渡されていることを確認できます。

于 2012-06-08T12:09:40.237 に答える