Process.Start(“ microsoft-edge:”)给我Win32Exception

时间:2019-07-16 12:37:02

标签: c# .net-core process microsoft-edge

当我执行以下代码行时:

Process.Start("microsoft-edge:");

Process.Start("microsoft-edge:http://localhost");

它给了我这个错误:

  

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

当我使用 Win + R 运行microsoft-edge:时,它会起作用。

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

知道为什么会这样吗?


编辑:

这些也不起作用:

Process.Start(@"c:\Windows\System32\LaunchWinApp.exe:http://localhost");
Process.Start(@"http://localhost");

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

这也可以,但是我不能用它打开特定的网页

Process.Start("explorer", @"shell:Appsfolder\Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge");

4 个答案:

答案 0 :(得分:2)

您不能简单地打开带有预期呼叫Process.Start("url");的网址

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

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

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

但是由于此代码不仅可以在Windows机器上运行,所以我考虑使用更跨平台的东西,例如(https://brockallen.com/2016/09/24/process-start-for-urls-on-net-core/):

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;
        }
    }
}

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

调用

答案 1 :(得分:1)

此处显示了确切的根本原因:https://docs.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();

请@Lex Li和@Bizhan提出导致此解决方案的意见。

答案 2 :(得分:1)

这种变化似乎也可以完成工作:

Process.Start(new ProcessStartInfo("msedge") { 
  UseShellExecute = true, 
  Arguments = "http://localhost" });

它避免了microsoft-edge:<url>语法的怪异,从而允许以常规方式传递更多chrome arguments

如果有人知道避免这种情况的原因,请大声说:)

答案 3 :(得分:0)

Windows Run窗口( Win + R )知道如何将“ microsoft-edge:”解析为可执行路径。通过Run窗口调用它时,它首先解析为路径。然后执行该路径中的实际可执行文件。

对于Process.Start,没有这种路径解析。它仅查找某些路径,例如应用程序路径或PATH变量。显然,它找不到要运行的可执行文件,因此也没有错误。

  

如果您的系统中使用引号声明了路径变量,那么在该位置启动任何进程时,必须完全限定该路径。否则,系统将找不到路径。例如,如果c:\ mypath不在您的路径中,并且使用引号将其添加:path =%path%;“ c:\ mypath”,则启动它时必须完全限定c:\ mypath中的任何进程。

     

Source

请注意,此重载不允许使用命令行参数:

  

此重载不允许该进程使用命令行参数。如果需要为进程指定一个或多个命令行参数,请使用Process.Start(ProcessStartInfo)或Process.Start(String,String)重载。