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 denied
。 Process.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@)即使UseShellExecute
是false
也可以直接执行。
【讨论】:
是的,它适用于定义的属性。值得一提的是,在这种情况下,路径应该在 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 平台的有效应用程序”