【问题标题】:Process.Start(url) failsProcess.Start(url) 失败
【发布时间】:2026-02-11 00:35:02
【问题描述】:

我有一个面向 .NET 2.0 的 WinForms 应用程序。我们有一个报告说我们的一个按钮不起作用,它所做的只是在他们的默认浏览器中打开一个网页。查看日志我可以看到 Process.Start() 失败,因为它找不到文件。问题是我们将字符串 url 传递给 Start() 方法,所以我无法理解它为什么会生成此消息。

以下是日志中的异常:

System.ComponentModel.Win32Exception: The system cannot find the file specified
   at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start()
   at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start(String fileName)
   at *namespace*.Website.LaunchWebsiteAsync(String url)
The system cannot find the file specified
   at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start()
   at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start(String fileName)
   at *namespace*.Website.LaunchWebsiteAsync(String url)

为了完整性:

Process.Start(url);

其中 url 的值类似于:“http://www.example.com

在网上搜索后,我遇到了同样的问题this blog。不同之处在于这是特定于 Windows 8 的。他发现一些浏览器在安装时没有正确注册自己。随着浏览器发布更新,此问题已得到修复。 (Windows 8 发布后不久发布的博客)。

如果我们的客户没有安装浏览器,我可以理解。但这种情况并非如此。我还加载了一个 Windows XP 虚拟机,并尝试从文件类型选项卡下的文件夹选项窗口中删除 .htmlURL: HyperText Transfer Protocol 等文件类型的所有关联。但我无法重现该问题。

有没有人知道为什么这可能会失败,和/或我如何重现错误?

附带说明,我们的客户运行的是 Windows XP。

【问题讨论】:

  • 你能给我们你正在使用的 url 字符串吗?这可能会有所帮助!
  • 您确定在客户端机器上传入的是http://www.example.com,而不是www.example.com?也许您可以在记录尝试的 URL 的 try-catch 块中添加日志记录代码。
  • 我没有输入真正的价值或 url,因为它是用于我们的私有 API。但它与http://website.net/variousparameters 类似。我可以确认网站没有关闭,或者类似的东西。这是我们的一位用户报告的,我无法重现它。
  • 不幸的是,如果客户的机器损坏或配置错误,您将无能为力。这只是一个事实。漫长的道路可能是通过注册表查看默认的网络浏览器并使用该路径,然后使用您网站的命令参数并以这种方式使用 ProcessStartInfo(或 Process.Start 接受参数的重载)跨度>

标签: c# .net winforms


【解决方案1】:

遇到同样的问题,无需 IE 后备即可解决。
这将使它的行为更像是在“运行”窗口中键入它:

Process.Start(new ProcessStartInfo("https://www.example.com") { UseShellExecute = true });

注意我设置的是UseShellExecute = true

.Net Framework 上的默认值应该是true.Net Core 上的默认值应该是false
并且 UWP 应用不应使用此标志。 see docs
(我在 .Net Core 上运行)

【讨论】:

  • 这是 .NET Core 用户更好的解决方案,而不是强制使用任何特定的浏览器。
  • 对此的更新。如果这是 .Net 5 上的 WPF,您将需要使用“true”。感谢您提供如此优雅的解决方案。
  • 我必须在 .NET 5 上设置 UseShellExecute = true 才能使其工作。
【解决方案2】:

尝试将explorer.exe 明确用于fileName

详见Process.Start(url) broken on Windows 8/Chrome - are there alternatives?

Process.Start("explorer.exe", url);

【讨论】:

  • 我刚刚尝试在 XP 中安装 Firefox 和 Chrome 并将其设置为默认值。在这两种情况下,我都无法重现该问题。我将添加此更改并让客户尝试一下。感谢您的帮助。
  • 还是没有运气。我相信Ahmed ilyay's comment 是正确的,他们的机器有问题。将您的答案标记为正确,因为我认为这是应该做的。谢谢大家的帮助。
【解决方案3】:

您可以使用 Windows 操作系统附带的InternetExplorer 打开URL

试试这个:

Process.Start("IEXPLORE",url);

【讨论】:

  • 我们忽略了它,以便它会在用户的default browser 中启动。此外,我们不能保证会安装 IE。我承认这不太可能,但仍然如此。感谢您的帮助。
  • 是的,我同意。您是否通过在默认浏览器中手动输入来尝试相同的 url?
  • URL 按预期工作。当它在他们的机器上使用Process.Start() 启动时,我们遇到了错误。我相信这与他们的机器有关,但不知道是什么......
  • @DarrenHale:检查 Romoku 的答案,它应该可以解决您的问题。
【解决方案4】:

对于 Core 中的某些用例,即使设置了ProcessInfo.WorkingDirectory,也需要设置Environment.CurrentDirectory:API 中的不直观差异无疑会导致大量移植代码中断和混乱。

【讨论】:

    【解决方案5】:

    我在 Windows 窗体应用程序中有这段代码,它工作正常:

    var info = new ProcessStartInfo(url);
    Process.Start(info);
    

    【讨论】:

    • 查看异常的堆栈,我相信如果您使用字符串重载,它默认为您提供的代码。感谢您的帮助。
    • 是的,我也这么认为。只是希望行为上可能有所不同。当然,现在我注意到您说的是 .NET 2.0。此代码在 4.5 中运行良好。这可能是我看不到任何问题的原因。或者正如@Dayan 所说,也许是 XP。
    【解决方案6】:
    try
    {
      Process.Start(url);
    }
    catch (Win32Exception)
    {
      Process.Start("IExplore.exe", url);
    }
    

    特别是在您使用 XP 之后,这很可能是特定于机器的问题。

    【讨论】:

      【解决方案7】:

      我明白了

      System.ComponentModel.Win32Exception

      对于 WPF 框架项目 (host=win7, x64)。

      试试这个:

      filename="https://www.example.com"; 
      Process.Start(filename) 
      

      如果浏览器没有启动,在catch块中添加Process.Start("chrome.exe", filename)

      它将使用“https://www.example.com”启动 chrome 浏览器和选项卡。

      这里是完整的例子:

      try
      {
          var runningProcess = Process.GetProcessesByName("chrome");
          if (runningProcess.Length != 0)
          {
              Process.Start("chrome", filename);
              return;
          }
          runningProcess = Process.GetProcessesByName("firefox");
          if (runningProcess.Length != 0)
          {
              Process.Start("firefox", filename);
              return;
          }
          runningProcess = Process.GetProcessesByName("iexplore");
          if (runningProcess.Length != 0)
          {
              Process.Start("iexplore", filename);
              return;
          }
          Process.Start(filename);
      }
      catch (System.ComponentModel.Win32Exception)
      {
          Process.Start("chrome.exe", filename);
      }
      

      【讨论】:

      • 如果您有问题,请考虑寻找答案或发布您自己的问题,切勿将问题发布为另一个问题的答案。
      • 这是我的答案,不是问题。