在 DotNetCore 3.0 程序中使用通用协议方式启动文件关联应用
问题描述
在传统的基于 .NET Framework 的 WPF 程序中,我们可以使用如下代码段启动相关的默认应用:
# 启动默认文本编辑器打开 helloworld.txt
Process.Start("helloworld.txt");
# 启动默认浏览器打开 https://hippiezhou.fun/
Process.Start("https://hippiezhou.fun/");
但是上述协议方式在 .NET Core 中不再适用,当我们使用上述方式进行操作,程序会给我们爆如下的错误:
经 神樹桜乃 大佬提醒,我特意看了一下 ProcessStartInfo 的说明,如下图所示:
所以,这样一来我们就有两种方式来启动文件的关联应用了。
解决方法
方法一
手动创建 ProcessStartInfo 对象,并设置 UseShellExecute=True,示例代码如下所示:
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.FileName = "https://hippiezhou.fun";
Process.Start(startInfo);
方法二
使用 UWP平台下的 中的 Launcher 来启动关联应用。
注:使用如下方法的前提是需要我们的机器上安装 Windows 10 任一版本的 SDK,否则无法正常使用。
做过 UWP 开发的朋友应该对 Launcher 族下的 API 有所了解,这个下面的相关方法能够启动系统默认应用。我们想在 .NET Core 3.0 WPF 使用这个族的 API 需要进行一些配置才可以。
首先,我们需要修改我们的 .csproj 文件,使项目能够使用上述的 API,修改如下所示:
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<UseWPF>true</UseWPF>
</PropertyGroup>
<!--新增节点-->
<ItemGroup>
<PackageReference Include="System.Runtime.WindowsRuntime" Version="4.3.0" />
</ItemGroup>
<!--新增节点-->
<ItemGroup>
<Reference Include="Windows">
<HintPath>$(MSBuildProgramFiles32)\Windows Kits\10\UnionMetadata\10.0.17763.0\Windows.winmd</HintPath>
<IsWinMDFile>true</IsWinMDFile>
<Private>false</Private>
</Reference>
</ItemGroup>
</Project>
然后,重新加载我们的项目,这个时候就可以使用 Launcher 了。比如,我们可以使用如下方式调用默认浏览器打开目标网址:
await Launcher.LaunchUriAsync(new Uri("https://hippiezhou.fun/"));