在 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/"));

相關參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM