#c# #.net #uwp #appxmanifest #full-trust
Вопрос:
У меня есть решение в 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>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.