1

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

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

MSDN - Process.Start() 页面

"Starts (or reuses) the process resource that is specified by the StartInfo property 
of this Process component and associates it with the component."

建议它应该重用Process. 我错过了什么?

谢谢你的时间。

4

3 回答 3

1

这是我用来启动第三方应用程序的功能:

    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;

    }
于 2012-05-31T10:19:17.487 回答
1

也许您应该考虑使用Process.GetProcessesByName来了解您正在启动的应用程序是否已经在运行。

于 2012-05-31T10:14:39.077 回答
0

如下使用它

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.
于 2012-05-31T10:20:46.120 回答