2010-08-03 5 views
2

J'essaie actuellement d'installer plusieurs services en utilisant ManagedInstallerClass.InstallHelper.Utilisation de ManagedInstallerClass.InstallHelper pour installer plusieurs services

L'exécution du code se passe sans problème lorsque j'installe le premier service, puis une erreur indique qu'un service portant le même nom existe déjà. Cependant, si je quitte le programme puis exécute le même processus à partir du second service, tout se passe bien.

La fonction que j'utilise est celle-ci.

ManagedInstallerClass.InstallHelper(arguments.ToArray()); 

Je suis sûr à 100% que les arguments sont corrects.

L'exception que j'ai est celle-ci:

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

Mon sentiment profond est que le ManagedInstallerClass conserve quelque chose dans son ventre et donc lors de l'exécution du second appel dans le même processus quelque chose va mal.

Quelqu'un a une idée de ce qui se passe et pourquoi?

+0

Comment savez-vous que les args sont corrects? C'est une méthode à ne pas utiliser, elle ne décrit pas le format requis du tableau de chaînes. En outre, il n'installe pas de services, il nécessite des noms d'assembly, des assemblys disposant d'un programme d'installation. –

+0

Les args sont bien en effet. Comme je l'ai dit, le premier appel se passe bien - le second casse avec l'exception que j'ai énumérée. Si je redémarre le programme et exécute juste le deuxième appel, l'appel va bien aussi - et ainsi de suite avec troisième, quatrième, etc. – sh0uzama

Répondre

5

Après beaucoup de tests, je n'ai toujours pas réussi à résoudre le problème avec ManagedInstallerClass. Ce que j'ai obtenu à la place est une solution de contournement du problème.

Ainsi, au lieu d'appeler:

ManagedInstallerClass.InstallHelper(arguments.ToArray()); 

maintenant j'appelle

callInstallUtil(arguments.ToArray()); 

la fonction est définie:

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; 
} 

Plusieurs appels de cette fonction pour les différents services donnent aucune erreur , donc je suppose que cela fonctionne pour moi :) - ce n'est pas aussi élégant que l'appel ManagedInstallerClass, bu t il fait le travail.

Questions connexes