Использование ManagedInstallerClass.InstallHelper для установки нескольких служб - PullRequest
3 голосов
/ 03 августа 2010

В настоящее время я пытаюсь установить несколько служб, используя ManagedInstallerClass.InstallHelper .

Выполнение кода проходит гладко, когда я устанавливаю первую службу, а затем выдает ошибку о том, что служба стакое же имя уже существует.Однако, если я выйду из программы, затем выполню тот же процесс, начиная со второй службы, все пройдет гладко.

Я использую эту функцию.

ManagedInstallerClass.InstallHelper(arguments.ToArray());

Я уверен на 100%что аргументы верны.

Исключение, которое у меня есть, это:

System.InvalidOperationException: "The installation failed, and the rollback has been performed."
Inner Exception: "The specified service already exists"

Мне кажется, что ManagedInstallerClass что-то держит в животе и, следовательно, при выполнении второго вызова вВ этом же процессе что-то идет не так.

Кто-нибудь имеет представление о том, что происходит и почему?

1 Ответ

6 голосов
/ 06 августа 2010

После большого количества испытаний я все еще не смог решить проблему с ManagedInstallerClass.

Вместо этого я обошел проблему.

Итак, вместо звонка:

ManagedInstallerClass.InstallHelper(arguments.ToArray());

сейчас я звоню

callInstallUtil(arguments.ToArray());

функция определена:

public static string InstallUtilPath = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory();
private bool callInstallUtil(string[] installUtilArguments)
{
    Process proc = new Process();
    proc.StartInfo.FileName = Path.Combine(InstallUtilPath, "installutil.exe");
    proc.StartInfo.Arguments = String.Join(" ", installUtilArguments);
    proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.UseShellExecute = false;

    proc.Start();
    string outputResult = proc.StandardOutput.ReadToEnd();
    proc.WaitForExit();

    //  ---check result---
    if (proc.ExitCode != 0)
    {
        Errors.Add(String.Format("InstallUtil error -- code {0}", proc.ExitCode));
        return false;
    }

    return true;
} 

Многократные вызовы этой функции для разных сервисов не приводят к ошибкам, поэтому я думаю, что это работает для меня :) - это не так элегантно, как вызов ManagedInstallerClass, но оно выполняет свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...