我有一个针对.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,并尝试从“文件类型”选项卡下的“文件夹选项”窗口中删除.html
,URL: HyperText Transfer Protocol
等文件类型的所有关联。但我无法重现这个问题。
有没有人知道为什么会失败,和/或我如何重现错误?
作为旁注,我们的客户正在运行Windows XP。
答案 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);
}