使用超链接打开网站时,Process.Start 抛出异常

3

在我的 RequestNavigate 事件处理程序中,此代码会抛出一个 System.ComponentModel.Win32Exception 异常。

Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
e.Handled = true;

这是我的XAML代码:

Visual Studio中的异常

<TextBlock Margin="0 0 40 40" FontSize="13" HorizontalAlignment="Right" VerticalAlignment="Bottom">
   <Hyperlink Foreground="Snow" RequestNavigate="Hyperlink_RequestNavigate" NavigateUri="http://www.google.com">Bizning jamoa bilan tanishishni</Hyperlink>
</TextBlock>

只需要 Process.Start(e.Uri.AbsoluteUri); 就可以了。尝试以管理员身份运行。https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.start?view=netframework-4.0 - Júlio César Schincariol Filho
2个回答

7

您需要将UseShellExecute设置为true

Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri) {UseShellExecute = true});

ProcessStartInfo.FileName文档中可以得知: 当 UseShellExecute 属性为 true 时,您可以使用 Process 组件启动任何文档,并对文件执行操作,例如打印。当 UseShellExecute 属性为 false 时,您只能使用 Process 组件启动可执行文件。 UseShellExecute 的默认值在 .NET Core 和 .NET Framework 中有所不同,请参考此处: ProcessStartInfo.UseShellExecute 在 .NET Core 上的默认值为 false,在 .NET Framework 上的默认值为 true。

哦哦哦哦,谢谢兄弟。问题已经解决了。 - Mukhammadkarim Tukhtaboyev
这真是一个愚蠢的差异,.NET Core和.NET Framework之间有这样的区别,幸好有像你这样的人来帮助找到这些细节! - CDRO

1
你需要告诉它使用ProcessStartInfo来执行Shellexecute。
以下是可避免此错误的工作代码:
hyper.RequestNavigate += (o, e) => 
Process.Start(new ProcessStartInfo(e.Uri.ToString()) { UseShellExecute = true });

这种行为是最近的变化。

以前不需要使用shellexecute,你可能会在SO的旧答案中看到没有使用它的代码。


1
这个更改不是为了满足安全问题而引入的: “这个更改是为了性能原因而在.NET Core中引入的。通常,Process.Start用于直接启动应用程序。直接启动应用程序不需要涉及Windows shell并产生相关的性能成本。为了使这种默认情况更快,.NET Core将ProcessStartInfo.UseShellExecute的默认值更改为false。如果需要,您可以选择较慢的路径。”(Microsoft Docs - BionicCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接