C# Process.Start返回null

C# Process.Start返回null,c#,process,C#,Process,我正在编写一个程序,在目录中启动一个随机文件。该文件可以是任何时间的,但主要是视频或图像文件。 每次启动文件时,我都要关闭上一个打开的文件。 代码是: string FolderSelected = ""; string FileName = ""; Process proc; List<string> FilesDisplayed = new List<string>(); public Form1() {

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

    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);


    }
string FolderSelected=”“;
字符串FileName=“”;
过程过程;
列表文件显示=新列表();
公共表格1()
{
初始化组件();
}
私有无效按钮2\u单击(对象发送者,事件参数e)
{
如果(FolderSelected==string.Empty)
FolderSelected=Properties.Settings.Default.FilesDefaultFolder;
如果(proc!=null)
{
进程CloseMainWindow();
过程关闭();
}
FileName=FetchRandomFile();
proc=Process.Start(文件名);
}
问题是,我一直在获取proc=null(文件已正确启动),无法获取以前打开的进程以关闭它。我知道.NET重用进程,这就是它返回Null的原因,但我需要重写此行为。 请帮忙,
Guy.

您正在方法范围中声明'proc',因此当在该方法顶部选中时,它当然将始终为空。如果希望引用位于函数之外,请将其声明为类级变量


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

编辑:多亏了leppie的评论,我怀疑我知道答案:我猜您正在“启动”类似于图像的东西,它是重用现有的过程来打开文档,而不是创建一个新的过程

我用这个简单的测试应用程序复制了这一点:

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图像查看器,而不是创建一个新进程。

甚至不会编译(明确分配)。作为一个方法变量,
proc
仅对声明方法(/scope)是本地的,即
按钮2\u单击
,这解释了为什么不能保留值。如果
proc
要在调用之间保持,请将其升级为字段(每个实例变量):


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

而不是

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


静态进程启动(ProcessStartInfo startInfo)
如果进程未启动(或已启动),则可以返回
null
。我需要覆盖此行为,因为我想在打开新文件之前关闭上次打开的文件。“我怎么能做到这一点?”加斯25:我想你做不到。您可以使用
ProcessStartInfo
并将
UseShellExecute
设置为false,但我怀疑这只会使它无法启动。如果您知道应该使用哪个进程,您可以显式地启动该可执行文件。谢谢,但是找出哪个进程的开销太大了。我只需要一个简单的随机打开和关闭文件的程序。它在我的情况下不工作。我得到了一个例外,它说该文件不是一个正确的Win32应用程序(在我的例子中,它是一个视频文件)。这仅适用于可执行文件。如果
UseShellExecute
主要帮助查找要使用的文件(如image/pdf/doc/…)的应用程序,则这不会解决问题。如果它与
UseShellExecute=false
一起工作,它甚至还将与
UseShellExecute=true
一起工作,并使用有效的进程进行响应。
Process.Start("filename", "args")`
Process.Start(new ProcessStartInfo() {
    Filename = "filename",
    Arguments = "args",
    UseShellExecute = false
}