我刚刚将一个桌面应用程序从Framework迁移到了Core 3.0。
Process.Start(path_to_folder);
在Framework中可以正常工作,但在Core中会抛出Win32Exception: Access denied
异常。 Process.Start("explorer.exe", path_to_folder);
在两者上都能正常工作。
这是Core中的一个错误或限制吗?
我刚刚将一个桌面应用程序从Framework迁移到了Core 3.0。
Process.Start(path_to_folder);
在Framework中可以正常工作,但在Core中会抛出Win32Exception: Access denied
异常。 Process.Start("explorer.exe", path_to_folder);
在两者上都能正常工作。
这是Core中的一个错误或限制吗?
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
),即使UseShellExecute
为false
,该文件也可以直接执行。
Process.Start(string)
始终意味着要输入文件名而不是文件夹路径。 - Herohtar