Core 3.0中的Process.Start不会仅按名称打开文件夹

时间:2019-11-13 22:38:01

标签: c# .net-core-3.0

我刚刚将桌面应用程序从Framework迁移到了Core 3.0。

Process.Start(path_to_folder);在Framework中工作正常,但在Core中抛出Win32Exception: Access deniedProcess.Start("explorer.exe", path_to_folder);都可以正常工作。

这是Core中的错误或限制吗?

1 个答案:

答案 0 :(得分:3)

我怀疑ProcessStartInfo.UseShellExecute property是允许它在.NET Framework上运行的原因。从文档中...

  

.NET Framework应用程序上的默认值为true ,. NET Core应用程序上的默认值为false

...以及仅使用Process.Start()参数的string重载可能会将该属性保留为默认值。要解决此问题,请创建自己的ProcessStartInfo,并将UseShellExecute属性设置为true,然后将其传递给Process.Start()的重载...

ProcessStartInfo startInfo = new ProcessStartInfo(path_to_folder) {
    UseShellExecute = true
};

Process.Start(startInfo);

出于完整性考虑,当我尝试运行此程序时...

Process.Start(Environment.SystemDirectory);

...在.NET Core 3.0中,我收到此异常...

  

未处理的异常。 System.ComponentModel.Win32Exception(5):访问被拒绝。

     
       

Process.Start()Process.StartWithCreateProcess(ProcessStartInfo startInfo)之间缺少的链接是Process.StartCore(ProcessStartInfo startInfo),该链接基于UseShellExecute的值分支,我想可以内联。呼叫后,似乎是thrown例外 CreateProcess(),大概是因为目录路径被指定为可执行文件。

请注意,如果您将不可执行文件的路径传递给相同的Process.Start(String fileName)重载,则异常消息将变为“指定的可执行文件不是此OS平台的有效应用程序。”

尽管遵循基本相同的代码路径,但调用Process.Start(String fileName, String arguments)仍然有效的原因是因为它在幕后创建的ProcessStartInfo实例具有一个FileName property可以做到的 引用即使explorer.exeUseShellExecute也可以直接执行的文件(false)。