2010-10-18 6 views
0

J'utilise Process.Start() pour initialiser une copie élevée de l'application en cours d'exécution. Malheureusement, Process.Start() renvoie null car il pense utiliser un processus existant de mon application et, bien qu'il existe un processus existant, il ne spécifie aucun moyen de gérer ce type de point d'entrée.Process.Start() renvoie null sur son propre processus

Y at-il un moyen quelconque dans .NET (via la configuration ou autre) que je puisse dire au système de ne pas réutiliser les copies existantes de mon processus? Cette question ne semble se produire sous Windows XP, et non Vista ou 7.

Une copie du code est ci-dessous:

internal static bool EnsureAssociation() 
{ 
    // Check to make sure RoketPack is associated. 
    if (!Protocol.IsAssociated()) 
    { 
     ProcessStartInfo info = new ProcessStartInfo(); 
     info.FileName = UNC.UniversalApplicationPath; 
     info.UseShellExecute = true; 
     if (!UAC.IsAdmin()) 
      info.Verb = "runas"; // Provides Run as Administrator 
     info.Arguments = "--associate"; 
     Process proc = null; 
     try 
     { 
      proc = Process.Start(info); 
     } 
     catch (Win32Exception) 
     { 
      Errors.Raise(Errors.ErrorType.ERROR_CAN_NOT_ASSOCIATE_PROTOCOL); 
      return false; 
     } 

     if (null != proc) 
     { 
      // Wait until the association is complete. 
      proc.WaitForExit(); 
      return Protocol.IsAssociated(); 
     } 
     else 
     { 
      Errors.Raise(Errors.ErrorType.ERROR_CAN_NOT_ASSOCIATE_PROTOCOL); 
      return false; 
     } 
    } 
    else 
     return true; 
} 

Répondre

0

Je résolu ce problème en vérifiant si UAC.IsAdmin() est vrai et, si c'est le cas, effectuez simplement les actions que le processus élevé aurait effectuées. Cela ne résout pas directement le problème de Process.Start() retournant null, mais je pense que la situation de réutilisation est causée parce que le processus qui aurait été démarré est identique à tous égards (où comme si le le processus est démarré élevé via le verbe 'runas', il est considéré comme différent et ne renverra pas de null).

0

Ce que vous voulez faire est le comportement par défaut, c'est-à-dire que n'importe quel programme peut exécuter plusieurs instances. Empêcher l'exécution de l'application plus d'une fois nécessiterait du code supplémentaire.

regardant dans Reflector à Process.Start()

public static Process Start(ProcessStartInfo startInfo) 
{ 
    Process process = new Process(); 
    if (startInfo == null) 
    { 
     throw new ArgumentNullException("startInfo"); 
    } 
    process.StartInfo = startInfo; 
    if (process.Start()) 
    { 
     return process; 
    } 
    return null; 
} 

Vous pouvez suivre où est de retour null. Il renverra null si le processus ne démarre pas à l'intérieur de process.Start().

public bool Start() 
{ 
    this.Close(); 
    ProcessStartInfo startInfo = this.StartInfo; 
    if (startInfo.FileName.Length == 0) 
    { 
     throw new InvalidOperationException(SR.GetString("FileNameMissing")); 
    } 
    if (startInfo.UseShellExecute) 
    { 
     return this.StartWithShellExecuteEx(startInfo); 
    } 
    return this.StartWithCreateProcess(startInfo); 
} 

...

Vous avez l'idée. Continuez à tracer la raison pour laquelle vous obtenez une valeur null. Si vous n'avez pas de copie de Reflector, OBTENEZ-LE MAINTENANT! NB: Toutes nos excuses que cela ne vous donne pas la solution exacte à votre problème, mais il montre que vous pouvez trouver vous-même. :)

HTH,