UWP FullTrustProcessLauncher 在启动时给出“找不到元素”异常

Posted

技术标签:

【中文标题】UWP FullTrustProcessLauncher 在启动时给出“找不到元素”异常【英文标题】:UWP FullTrustProcessLauncher gives "Element not found" exception on launch 【发布时间】:2021-11-18 16:06:35 【问题描述】:

我在 Visual Studio 中有一个解决方案,其中包含一个 Windows 应用程序打包项目、一个 UWP 项目和一个控制台应用程序项目。 UWP 应用程序包含一个按钮,按下该按钮时应该将控制台应用程序作为完全信任进程启动。解决方案资源管理器如下所示:

Windows 应用程序打包项目设置为启动项目。它的入口点设置为 UWP 应用。 UWP 应用和控制台应用都作为引用添加到打包项目中。

配置管理器如下所示:

控制台应用设置为 UWP 应用的依赖项。 UWP 应用的依赖项如下所示:

构建顺序如下所示:

代码

这是控制台应用程序的代码:

using System;
using System.Diagnostics;

namespace ShellHost

    class Program
    
        static void Main(string[] args)
        
            Console.WriteLine("Hello World!");

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        
    

正如我所提到的,UWP 应用只有一页 (MainPage.xaml),其背后的代码如下所示:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.ApplicationModel;

namespace OnScreenDeviceManager

    public sealed partial class MainPage : Page
    
        public MainPage()
        
            this.InitializeComponent();
        

        private async void button_Click(object sender, RoutedEventArgs e)
        
            await FullTrustProcessLauncher.LaunchFullTrustProcessForAppAsync("Default");
        
    

UWP 应用的清单未修改。包的清单已修改为包含完全信任功能,并且它包含完全信任过程的必要扩展。 xml 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
  IgnorableNamespaces="uap rescap desktop">

  <Identity
    Name="d3e964dc-9265-4243-b97c-2dacb7c11dac"
    Publisher="CN=Dell"
    Version="1.0.0.0" />

  <Properties>
    <DisplayName>Package</DisplayName>
    <PublisherDisplayName>Dell</PublisherDisplayName>
    <Logo>Images\StoreLogo.png</Logo>
  </Properties>

  <Dependencies>
    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0" />
  </Dependencies>

  <Resources>
    <Resource Language="x-generate"/>
  </Resources>

  <Applications>
    <Application Id="App"
      Executable="$targetnametoken$.exe"
      EntryPoint="$targetentrypoint$">
      <uap:VisualElements
        DisplayName="Package"
        Description="Package"
        BackgroundColor="transparent"
        Square150x150Logo="Images\Square150x150Logo.png"
        Square44x44Logo="Images\Square44x44Logo.png">
        <uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" />
        <uap:SplashScreen Image="Images\SplashScreen.png" />
      </uap:VisualElements>
      <Extensions>
        <desktop:Extension Category="windows.fullTrustProcess" Executable="ShellHost\ShellHost.exe">
            <desktop:FullTrustProcess>
                <desktop:ParameterGroup GroupId="SyncGroup" Parameters="/Sync"/>
                <desktop:ParameterGroup GroupId="OtherGroup" Parameters="/Other"/>
                <desktop:ParameterGroup GroupId="Default" Parameters=""/>
            </desktop:FullTrustProcess>
        </desktop:Extension>
      </Extensions>
    </Application>
  </Applications>

  <Capabilities>
    <Capability Name="internetClient"/>
    <rescap:Capability Name="runFullTrust" />
  </Capabilities>
</Package>

解决方案 exe 所在的 package/debug/bin 文件夹如下所示:

可以在ShellHost文件夹中清晰的看到控制台应用exe(ShellHost.exe)。

控制台应用程序已经过测试并且运行良好。 UWP 应用程序运行良好,除非我单击按钮时出现“找不到元素”异常。

异常消息说:

System.Exception: 'Element not found. (Exception from HRESULT: 0x80070490)'

This exception was originally thrown at this call stack:
    [External Code]
    OnScreenDeviceManager.MainPage.button_Click(object, Windows.UI.Xaml.RoutedEventArgs) in MainPage.xaml.cs

谁能帮我解决这个问题?我错过了什么?

【问题讨论】:

UWP 不需要将控制台应用添加为依赖项,请尝试从 UWP 依赖项中删除控制台应用。 这并没有解决问题。下面有人给出了答案。我把它放在那里影响构建顺序。但你是对的,它对整个项目的影响为 0。 【参考方案1】:

LaunchFullTrustProcessForAppAsync API 意味着您需要使用指定的应用程序 ID 启动完全信任进程。

我建议您尝试使用 LaunchFullTrustProcessForCurrentAppAsync(String) API 来替换您的代码。

 private async void button_Click(object sender, RoutedEventArgs e)
 
     await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync("Default");
 

【讨论】:

将“默认”更改为“应用程序”使其工作。我只有 ParameterGroupId 而不是 fulltrustPackageRelativeAppId。

以上是关于UWP FullTrustProcessLauncher 在启动时给出“找不到元素”异常的主要内容,如果未能解决你的问题,请参考以下文章

2019-11-25-加强版在国内分发-UWP-应用正确方式-通过win32安装UWP应用

为啥必须在 UWP 中使用 StreamSocketListener 而不是 TcpListener,尽管 UWP 是 .NET Core 的子集,而 TcpListener 在 UWP 中可用?

UWP使用AppService向另一个UWP客户端应用程序提供服务

[UWP]涨姿势UWP源码——IsolatedStorage

win10 uwp 如何开始写 uwp 程序

起调UWP的几种方法