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 虚拟机,并尝试从文件类型选项卡下的文件夹选项窗口中删除 .html
、URL: 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() 运行的可执行文件的崩溃
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不起作用?