Process.Start(url)失败

时间:2014-02-17 17:46:14

标签: c# .net winforms

我有一个针对.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 VM,并尝试从“文件类型”选项卡下的“文件夹选项”窗口中删除.htmlURL: HyperText Transfer Protocol等文件类型的所有关联。但我无法重现这个问题。

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

作为旁注,我们的客户正在运行Windows XP。

7 个答案:

答案 0 :(得分:20)

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

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

请注意,我正在设置UseShellExecute = true

.Net Framework 上默认为true,在 .Net Core 上默认为false
和UWP应用程序不应使用此标志。 see docs
(我在.Net Core上运行)

答案 1 :(得分:10)

请明确使用explorer.exe fileName

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

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

答案 2 :(得分:2)

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

试试这个:

Process.Start("IEXPLORE",url);

答案 3 :(得分:1)

try
{
  Process.Start(url);
}
catch (Win32Exception)
{
  Process.Start("IExplore.exe", url);
}

特别是在处理XP之后,这很可能是机器特定问题。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我明白了

System.ComponentModel.Win32Exception

对于WPF Framework项目(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);
}