winforms 进程.启动(url)失败

gr8qqesn  于 2022-11-25  发布在  其他
关注(0)|答案(6)|浏览(160)

我有一个面向.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。

gcuhipw9

gcuhipw91#

有同样的问题,解决了没有IE回退.
这将使其行为更像是在“运行”窗口中键入:

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

请注意,我将UseShellExecute = true设置为
默认值在**.Net Framework上应为true,在.Net Core**上应为false
和UWP应用程序不应使用此标志。see docs
(我在.Net Core上运行)

6vl6ewon

6vl6ewon2#

尝试显式地将explorer.exe用于fileName
详见Process.Start(url) broken on Windows 8/Chrome - are there alternatives?

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

jq6vz3qz3#

您可以使用Windows操作系统沿着的InternetExplorer打开URL
试试这个:

Process.Start("IEXPLORE",url);
mzsu5hc0

mzsu5hc04#

有时在Core中,即使设置了ProcessInfo.WorkingDirectory,也需要设置Environment.CurrentDirectory

pb3skfrl

pb3skfrl5#

我在一个windows窗体应用程序中有这样的代码,它工作得很好:

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

tmb3ates6#

我得到
System.ComponentModel.Win32Exception
适用于WPF框架项目(主机=win7,x64)。
试试看:

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

如果浏览器未启动,则在catch块中添加Process.Start("chrome.exe", filename);
它将以启动chrome浏览器,并以“https://www.example.com“作为标签。
下面是完整的示例:

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

相关问题