我刚刚将桌面应用程序从Framework迁移到了Core 3.0。
Process.Start(path_to_folder);
在Framework中工作正常,但在Core中抛出Win32Exception: Access denied
。 Process.Start("explorer.exe", path_to_folder);
都可以正常工作。
这是Core中的错误或限制吗?
答案 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.exe
为UseShellExecute
也可以直接执行的文件(false
)。