如何创建一个超过其父级的流程

时间:2009-06-17 18:45:41

标签: c# windows process

我正在尝试为我开发的平台启动外部更新程序。我想启动此更新程序的原因是因为我处理平台更新和许可证配置的配置实用程序与将部署更新的文件夹中的其他程序集共享依赖关系。因此,虽然我可以重命名配置实用程序并在部署更新时覆盖它,但我无法重命名或覆盖它所依赖的DLL。因此,外部更新程序应用程序。

我正在处理配置实用程序中的所有更新收集逻辑,然后尝试启动更新程序以处理实际的文件复制/覆盖操作。显然,由于文件正在使用中,我需要配置实用程序在更新程序开始后立即退出。

我遇到的问题是我使用标准的Process.Start方法启动更新程序,一旦配置实用程序退出,更新程序进程也会被终止。

有什么方法可以创建一个超过其父级的进程,或启动一个可以超出启动它的程序运行的外部应用程序?

编辑:

显然,在我的updater应用程序中,我错误地计算了传递给它的命令行参数的数量。因此,更新程序将立即退出。我误解了这意味着启动器应用程序正在杀死“子”进程,而事实上并非如此。

以下答案是正确的。

3 个答案:

答案 0 :(得分:12)

您看到的问题似乎有不同的原因,因为当您的应用程序退出时,Process类不会终止使用Process.Start启动的任何进程。

看到这个简单的示例程序,计算器将保持打开状态:

using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        Process.Start(@"C:\windows\system32\calc.exe");
    }
}

答案 1 :(得分:5)

当启动器退出时,Process.Start开始的进程没有理由自动死亡。我的猜测是你在更新程序中做了一些奇怪的事情。

我之前写过一个更新程序就是这样做的,而且一切都很好。

例如:

Launcher.cs:

using System;
using System.Diagnostics;

class Launcher
{
    static void Main()
    {
        Console.WriteLine("Launching launchee");
        Process.Start("Launchee.exe");
        Console.WriteLine("Launched. Exiting");
    }
}

Launchee.cs:

using System;
using System.Threading;

class Launchee
{
    static void Main()
    {
        Console.WriteLine("       I've been launched!");
        Thread.Sleep(5000);
        Console.WriteLine("       Exiting...");
    }
}

单独编译它们,然后运行Launcher.exe。 “launchee”过程肯定比发射器持续时间更长。

答案 2 :(得分:0)

只是从我模糊的记忆中思考,但我似乎记得有一段时间的讨论,当从Form调用Process.Start方法时,生成的进程具有某种依赖性(不确定是什么,为什么或如何,记忆有点模糊。)

为了处理它,设置了一个标志,该标志在主表单/ app退出后实际从应用程序的Main()方法调用,如果该进程是从Main()方法启动的,那么eveything就是细

只是一个想法,就像我说的,这纯粹来自内存,但是这里发布的一些示例都是从控制台应用程序的Main()方法中调用的,似乎慢慢来。

希望一切顺利。