在Core 3.0中,Process.Start不能仅通过文件夹名称打开一个文件夹。

12

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

Process.Start(path_to_folder); 在Framework中可以正常工作,但在Core中会抛出Win32Exception: Access denied异常。 Process.Start("explorer.exe", path_to_folder); 在两者上都能正常工作。

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


听起来更像是.NET Framework中处理方式的意外副作用,因为Process.Start(string)始终意味着要输入文件名而不是文件夹路径。 - Herohtar
1个回答

17
我怀疑ProcessStartInfo.UseShellExecute属性是能够让它在.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): 拒绝访问。

Process.Start()Process.StartWithCreateProcess(ProcessStartInfo startInfo) 之间的缺失环节是 Process.StartCore(ProcessStartInfo startInfo),它基于 UseShellExecute 的值进行分支,我想会被内联。异常似乎在调用 CreateProcess() 后被 抛出, 可能是因为指定了目录路径作为可执行文件。

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

调用Process.Start(String fileName, String arguments)方法能够正常工作的原因是它在代码路径上遵循了大致相同的规则,因为它在内部创建的ProcessStartInfo实例具有一个FileName property属性,该属性确实引用了一个文件(explorer.exe),即使UseShellExecutefalse,该文件也可以直接执行。

1
是的,它与定义的属性一起工作。值得一提的是,在这种情况下,路径应该在FileName属性中定义。 - yaugenka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接