Process.Start(url) 失败

Posted

技术标签:

【中文标题】Process.Start(url) 失败【英文标题】:Process.Start(url) fails 【发布时间】:2022-01-22 04:17:59 【问题描述】:

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

我明白了

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

【讨论】:

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

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

【讨论】:

【参考方案3】:

遇到了同样的问题,无需 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 才能使其工作。【参考方案4】:

尝试将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 是正确的,他们的机器有问题。将您的答案标记为正确,因为我认为这是应该做的。谢谢大家的帮助。【参考方案5】:
try

  Process.Start(url);

catch (Win32Exception)

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

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

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

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

试试这个:

Process.Start("IEXPLORE",url);

【讨论】:

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

以上是关于Process.Start(url) 失败的主要内容,如果未能解决你的问题,请参考以下文章

识别 C# Process.Start() 运行的可执行文件的崩溃

我必须处理 Process.Start(url) 吗?

C# Process.Start with credentials 失败,拒绝访问

安装程序在使用 Process.Start() 启动时失败,但在双击时工作

csharp Process.Start for .NET Core上的URL

c#中用System.Diagnostics.Process.Start(Path.GetFullPath(“vlc.exe.lnk“), url);用vlc的快捷方式打开http的url不起作用?