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

Posted

技术标签:

【中文标题】Core 3.0 中的 Process.Start 不会仅按名称打开文件夹【英文标题】:Process.Start in Core 3.0 does not open a folder just by its name 【发布时间】:2019-11-13 22:38:01 【问题描述】:

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

Process.Start(path_to_folder); 在框架中运行良好,但在核心中抛出 Win32Exception: Access deniedProcess.Start("explorer.exe", path_to_folder); 两者都可以正常工作。

这是核心中的错误或限制吗?

【问题讨论】:

听起来更像是旧行为是 .NET Framework 中的操作方式的意外副作用,因为 Process.Start(string) 总是意味着采用 文件名,不是文件夹路径。 【参考方案1】:

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

在 .NET Framework 应用上默认为 true,在 .NET Core 应用上默认为 false

...而仅采用 string 参数的 Process.Start() 重载可能只会将该属性保留为默认值。要解决此问题,请创建您自己的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):访问被拒绝。

System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) System.Diagnostics.Process.Start() System.Diagnostics.Process.Start(ProcessStartInfo startInfo) System.Diagnostics.Process.Start(String fileName)

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,确实 引用了一个文件(@ 987654352@)即使UseShellExecutefalse也可以直接执行。

【讨论】:

是的,它适用于定义的属性。值得一提的是,在这种情况下,路径应该在 FileName 属性中定义。

以上是关于Core 3.0 中的 Process.Start 不会仅按名称打开文件夹的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core 命令行应用程序 | Process.Start() 在某些机器上运行,但在其他机器上不运行

.Net Core 3.1 Process.Start("www.website.com") 在 WPF 中不起作用

.Net Core 2.0 Process.Start 抛出“指定的可执行文件不是此 OS 平台的有效应用程序”

C# 中的 Process.Start 与 Process `p = new Process()`?

Process.Start() 啥都不做

Windows Mobile 6.5 - Process.Start() 上的 TypeLoadException