Process.Start返回null

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

string FolderSelected = ""; string FileName = ""; Process proc; List FilesDisplayed = new List(); 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但我需要覆盖这种行为。 请帮忙,盖伊。

编辑:感谢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 Image Viewer,而不是创建新进程。

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

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

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

代替

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

使用

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

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

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