Process.Start返回null

gas*_*h25 18 c#

我正在编写一个程序,在目录中启动一个随机文件.该文件可以是任何时间,但主要是视频或图像文件.每次我启动一个文件,我想关闭以前打开的文件.代码是:

    string FolderSelected = "";
    string FileName = "";
    Process proc;

    List<string> FilesDisplayed = new List<string>();

    public Form1()
    {
        InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        if (FolderSelected == string.Empty)
            FolderSelected = Properties.Settings.Default.FilesDefaultFolder;

        if (proc != null)
        {
            proc.CloseMainWindow();
            proc.Close();
        }
        FileName = FetchRandomFile();
        proc = Process.Start(FileName);


    }
Run Code Online (Sandbox Code Playgroud)

问题是,我一直得到proc = null(文件正确启动),我无法获取以前打开的进程,以便关闭它.我知道.NET重用进程,这就是为什么它返回Null但我需要覆盖这种行为.请帮忙,盖伊.

Jon*_*eet 14

编辑:感谢leppie的评论,我怀疑我知道答案:我的猜测是你正在"开始"类似于图像的东西,并且它正在重复使用现有流程来打开文档而不是创建新文档.

我用这个简单的测试应用程序重现了这个:

using System;
using System.Diagnostics;

public class Test
{
    static void Main()
    {
        Process proc = Process.Start("image.tif");
        Console.WriteLine(proc == null);
    }
}
Run Code Online (Sandbox Code Playgroud)

这打印为"true",因为它dllhost.exe用于托管Windows Image Viewer,而不是创建新进程.

  • 如果进程没有启动(或者已经启动),`static Process Start(ProcessStartInfo startInfo)`可以返回`null`. (4认同)
  • @gash25:我*认为*你可以。您可以使用“ProcessStartInfo”并将“UseShellExecute”设置为 false,但我怀疑这只会使其无法启动。如果您知道应该使用哪个进程,则可以显式启动该可执行文件。 (2认同)

Ed *_* S. 0

您在方法范围内声明“proc”,因此在该方法的顶部检查时它当然始终为空。如果您希望引用存在于函数之外,请将其声明为类级别变量。

您每次(可能)都会生成一个进程,Process.Start 不会返回 null,但当 i 超出范围时,您只是丢失了对它的引用。