UWP FullTrustProcessLauncher выдает исключение «Элемент не найден» при запуске

#c# #.net #uwp #appxmanifest #full-trust

Вопрос:

У меня есть решение в Visual studio, содержащее проект упаковки приложений Windows, проект UWP и проект консольного приложения. Приложение UWP содержит одну кнопку, которая при нажатии должна запускать консольное приложение как процесс полного доверия. Обозреватель решений выглядит следующим образом:

Обозреватель решений

Проект упаковки приложений Windows задается как запускаемый проект. Это точка входа, настроенная для приложения UWP. Как приложение 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>ImagesStoreLogo.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="ImagesSquare150x150Logo.png"
        Square44x44Logo="ImagesSquare44x44Logo.png">
        <uap:DefaultTile Wide310x150Logo="ImagesWide310x150Logo.png" />
        <uap:SplashScreen Image="ImagesSplashScreen.png" />
      </uap:VisualElements>
      <Extensions>
        <desktop:Extension Category="windows.fullTrustProcess" Executable="ShellHostShellHost.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>
 

Папка package/debug/bin, в которой находится исполняемый файл решения, выглядит следующим образом:

Каталог пакетов

Вы можете четко видеть исполняемый файл консольного приложения (ShellHost.exe) в папке ShellHost.

Консольное приложение было протестировано и работает просто отлично. Приложение 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
 

Кто-нибудь может помочь мне решить эту проблему? Что я упускаю?

Комментарии:

1. UWP не нужно добавлять консольное приложение в качестве зависимости, пожалуйста, попробуйте удалить консольное приложение из зависимостей UWP.

2. Это никак не решило проблему. Кто — то дал ответ ниже. У меня было это там, чтобы повлиять на порядок сборки. Но вы правы, это никак не влияет на общий проект.

Ответ №1:

API LaunchFullTrustProcessForAppAsync означает, что вам необходимо запустить процесс полного доверия с указанным идентификатором приложения.

Я предлагаю вам попробовать использовать API LaunchFullTrustProcessForCurrentAppAsync(строка) для замены вашего кода.

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

Комментарии:

1. Изменение «По умолчанию» на «Приложение» заставило его работать. У меня был только параметр groupId, а не fulltrustPackageRelativeAppId.