我正在使用Process.Start()初始化当前正在运行的应用程序的提升副本。不幸的是,Process.Start()返回null,因为它认为它正在使用我的应用程序的现有进程,并且虽然存在现有进程,但它没有指定处理这种入口点的任何方法。
.NET(通过配置或其他方式)有什么方法可以告诉系统不要重用我的进程的现有副本?这个问题似乎只出现在Windows XP上,而不是Vista或7上。
代码的副本如下:
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;
}
答案 0 :(得分:0)
我通过检查UAC.IsAdmin()是否为true来解决这个问题,如果是,则只需执行提升过程将执行的操作。
这并没有直接解决Process.Start()返回null的问题,但我认为重新使用的情况是由于本来应该启动的进程在各个方面都是相同的(这就好像进程一样)通过'runas'动词开始提升,它被认为是不同的并且不会返回null。
答案 1 :(得分:0)
您要做的是默认行为,即任何程序都可以运行多个实例。防止应用程序多次运行需要额外的代码。
在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;
}
您可以追踪返回的地点null
。如果进程无法在null
内启动,它将返回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);
}
...
你明白了。继续跟踪您获得null
值的原因。如果您还没有Reflector的副本,立即获取!
注意:请注意,这并不能解决您的问题的完全解决方案,但它表明您可以自行查找。 :)
HTH,