Process.Start("microsoft-edge:") 在 dot net core 中抛出 Win32Exception

Biz*_*han 4 c# process .net-core microsoft-edge

当我执行以下代码行时:

Process.Start("microsoft-edge:");
Run Code Online (Sandbox Code Playgroud)

或者

Process.Start("microsoft-edge:http://localhost");
Run Code Online (Sandbox Code Playgroud)

它给了我这个错误:

System.ComponentModel.Win32Exception: '系统找不到指定的文件。'

当我microsoft-edge:使用Win+运行时,R它可以工作。

当我在 .net 框架中运行相同的代码时,它可以工作。

我正在使用 .netcore 3.0.0-preview6-27804-01

知道为什么会这样吗?


编辑:

这些也不起作用:

Process.Start(@"c:\Windows\System32\LaunchWinApp.exe:http://localhost");
Process.Start(@"http://localhost");
Run Code Online (Sandbox Code Playgroud)

我系统上的所有其他可执行文件都可以工作。

这也有效,但我无法用它打开特定网页:

Process.Start("explorer", @"shell:Appsfolder\Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge");
Run Code Online (Sandbox Code Playgroud)

Ala*_*jeu 7

确切的根本原因如下所示:https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.useshellexecute ?view=netframework-4.8

“默认值在 .NET Framework 应用程序上为 true,在 .NET Core 应用程序上为 false。”

这意味着直接的解决方案是设置UseShellExecute。除了创建显式 Process 对象来修改设置之外,以下内容与原始内容基本相同。

       Process pWeb = new Process();
       pWeb.StartInfo.UseShellExecute = true;
       pWeb.StartInfo.FileName = "microsoft-edge:http://localhost";
       pWeb.Start();
Run Code Online (Sandbox Code Playgroud)

感谢 @Lex Li 和 @Bizhan 的评论导致了这个解决方案。


M. *_*ena 6

您不能简单地打开带有预期调用的 url Process.Start("url");

您必须创建一个ProcessStartInfo并将浏览器和 url 作为参数传递:

Process.Start(new ProcessStartInfo("cmd", $"/c start microsoft-edge:http://localhost") { CreateNoWindow = true });
Run Code Online (Sandbox Code Playgroud)

(编辑)ProcessStartInfo需要使用,因为我们需要设置它CreateNoWindow = true以防止 cmd 窗口出现

但由于此代码不仅可以在 Windows 机器上运行,我会考虑使用更像这样的跨平台特定的东西(https://brockallen.com/2016/09/24/process-start-for-urls-网络核心/):

public void OpenBrowser(string url)
{
    try
    {
        Process.Start(url);
    }
    catch
    {
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") { CreateNoWindow = true });
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            Process.Start("xdg-open", url);
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
        {
            Process.Start("open", url);
        }
        else
        {
            throw;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并调用它 OpenBrowser("http://localhost");