在 DotNetCore 3.0 程序中使用通用协议方式启动文件关联应用
程序员文章站
2022-09-10 16:07:12
问题描述 在传统的基于 .NET Framework 的 WPF 程序中,我们可以使用如下代码段启动相关的默认应用: 但是上述协议方式在 .NET Core 中不再适用,当我们使用上述方式进行操作,程序会给我们爆如下的错误: 经 "神樹桜乃" 大佬提醒,我特意看了一下 ProcessStartInf ......
问题描述
在传统的基于 .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/"));