Process.Start返回null

时间:2010-08-11 07:55:51

标签: 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);


    }

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

5 个答案:

答案 0 :(得分:14)

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

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

using System;
using System.Diagnostics;

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

这会打印“true”,因为它使用dllhost.exe来托管Windows Image Viewer,而不是创建新进程。

答案 1 :(得分:0)

甚至不会编译(明确赋值)。作为方法变量proc仅对于声明方法(/ scope)是本地的 - 即button2_Click,这解释了为什么不能保留值。如果要在调用之间保持proc,请将其提升为字段(每个实例变量):

Process proc;
private void button2_Click(object sender, EventArgs e)
{
    if (proc != null)
    ...

答案 2 :(得分:0)

要解决此问题,您必须将UseShellExecute设置为false以绕过shell。

而不是

Process.Start("filename", "args")`

使用

Process.Start(new ProcessStartInfo() {
    Filename = "filename",
    Arguments = "args",
    UseShellExecute = false
}

答案 3 :(得分:-1)

您在方法范围内声明'proc',因此当在该方法的顶部检查时,总是为空。如果您希望引用超出函数的范围,请声明它是类级变量。

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

答案 4 :(得分:-1)

如果出于安全原因或出于某种原因(例如我的情况),您迫切需要启动文件的过程的引用,则必须创建自己的过程

  Process  process = new Process();
    process.StartInfo= new ProcessStartInfo(filename);
    process.Start();
    process.Disposed+= (s, e) =>      System.IO.File.Delete(filename);
    // and if you want to manually end the process you
    //could just use
 process.Dispose();

如果您自行处理或自动处理,则文件将被删除... 当然,不要忘记在可以达到的级别范围内标识您的流程