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,但是当我超出范围时你只是丢失对它的引用。