新版本.Net关于Process.Start的问题
在 .Net
开发中,试用 Process.Start()
来启动一个新进程,当我们传入的是具体文件或者链接的时候,系统也会根据默认打开方式打开对应的进程。但是在新版本的 .Net
中,试用 Process.Start()
来打开文件或者链接的时候,会抛出 System.ComponentModel.Win32Exception
的错误,提示系统找不到指定的文件。
解析
这和 Windows API
相关,在 Windows API
中对于启动进程有两个方法 CreateProcess/CreateProcessA
和 ShellExecute/ShellExecuteA
,分别用来响应 直接通过程序名来启动进程 和 通过默认打开方式启动进程并且打开文件 。
在 .Net Framework
的运行时中,Process.Start()
可以做到两种启动进程方式都能正确响应,但是在 .Net
中,必须为 通过默认打开方式启动进程并且打开文件 显式地去指定 UseShellExecute = true
,这样运行时才会通过ShellExecute/ShellExecuteA
的方式,从用户的系统设置中,找到匹配的默认打开方式,进而启动对应的进程。不然运行时会调用 CreateProcess/CreateProcessA
启动传入的文件名,但是由于传入的属于存档文件或者超链接,就会抛出 System.ComponentModel.Win32Exception
的错误,提示系统找不到指定的文件。