C# 使用System.Diagnostics.Process启动第三方应用程序

C# 使用System.Diagnostics.Process启动第三方应用程序,c#,process,singleton,C#,Process,Singleton,总之,我正在开发一个需要在运行时启动另一个应用程序的应用程序。为了启动第三方应用程序,我使用了System.Diagnostics.Process,为了确保我不会两次启动第三方应用程序,我采用了单例模式 需要singleton正在工作,但不需要Process.Start()方法。也就是说,虽然我得到的是从singleton返回的相同的进程对象,Start()正在启动第三方应用程序的另一个实例 发件人: 建议它应该重用进程的实例。我错过了什么 谢谢你的时间。 < P>也许你应该考虑使用进程。GET

总之,我正在开发一个需要在运行时启动另一个应用程序的应用程序。为了启动第三方应用程序,我使用了
System.Diagnostics.Process
,为了确保我不会两次启动第三方应用程序,我采用了单例模式

需要singleton正在工作,但不需要
Process.Start()
方法。也就是说,虽然我得到的是从singleton返回的相同的
进程
对象,
Start()
正在启动第三方应用程序的另一个实例

发件人:

建议它应该重用
进程的实例。我错过了什么


谢谢你的时间。

< P>也许你应该考虑使用<代码>进程。GETPyrestyByNAME<代码>来理解你正在启动的应用程序是否已经在运行。

< P>这是我用来启动第三方应用程序的函数:

    public static void ProcessStart(string ExecutablePath, string sArgs, bool bWait)
    {
        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.EnableRaisingEvents = false;
        proc.StartInfo.FileName = ExecutablePath;

        if(sArgs.Length > 0)
            proc.StartInfo.Arguments = sArgs;


        proc.Start();

        if(bWait)
            proc.WaitForExit();

        if(ProcessLive(ExecutablePath))
            return true;
        else
            return false;               

    }
ExecutablePath:可执行文件的完整路径

sArgs:命令行参数

bWait:等待进程退出

在我的例子中,我使用一个辅助函数来确定进程是否已经在运行。这并不完全是您想要的,但它仍然有效:

    public static bool ProcessLive(string ExecutablePath)
    {
        try
        {

            string strTargetProcessName = System.IO.Path.GetFileNameWithoutExtension(ExecutablePath);

            System.Diagnostics.Process[] Processes = System.Diagnostics.Process.GetProcessesByName(strTargetProcessName);

            foreach(System.Diagnostics.Process p in Processes)
            {
                foreach(System.Diagnostics.ProcessModule m in p.Modules)
                {
                    if(ExecutablePath.ToLower() == m.FileName.ToLower())
                        return true;
                }
            }
        }
        catch(Exception){}

        return false;

    }
使用它如下

Process[] chromes = Process.GetProcessesByName("ProcessName"); to check whether ur process is already running or not. Based on the u can use the process already running.

在再次调用
Start()
之前,是否检查最后一个进程是否仍在运行?(使用
HasExited
属性)我可以,但让人困惑的是,文档表明这将通过调用
Start()
+1来解决。谢谢这是一个选项,但正如我在上面的评论中所说的。MSDN建议这将由
Start()
处理?
Process[] chromes = Process.GetProcessesByName("ProcessName"); to check whether ur process is already running or not. Based on the u can use the process already running.