Ошибка при создании пакета приложения с "fullTrustProcess", указывающим на исполняемый файл

Я пытаюсь развернуть пример приложения для подключения приложений AppServices с помощью приложения UWP. Образец запускается и строит просто отлично, но когда я пытаюсь следовать руководству, чтобы упаковать все это, он дает мне ошибку.

Ссылка на руководство по упаковке

Пример хранилища примеров AppService Bridge.

Сообщение об ошибке:

 Error Manifest validation error: Line 36, Column 64, Reason: The file name  "BackgroundProcess.exe" declared for element "*[local-name()='Applications']/*[local-name()='Application']/*[local-name()='Extensions']/*[local-name()='Extension' and @Category='windows.fullTrustProcess']" doesn't exist in the package.

Я нашел код-фрагмент, генерирующий ошибку, но пока еще не нашел исправления.

Если я удаляю следующий код из файла Package.appxmanifest, визуальная студия успешно создает пакет:

<Extensions>
  <uap:Extension Category="windows.appService">
    <uap:AppService Name="CommunicationService" />
  </uap:Extension>
  <desktop:Extension Category="windows.fullTrustProcess" Executable="BackgroundProcess.exe" />
</Extensions>

Но это, безусловно, также устранит переход к процессу, который является целым пунктом этого упражнения.

Это, похоже, несколько связано с этим вопросом, но разница в том, что у меня есть .exe, и этот вопрос, кажется, отвечает на него. DLL:

Ошибка при создании универсального приложения для магазина: "Файл манифеста ссылок" MyAppName.dll", который не является частью полезной нагрузки. "

(Обновление инструментов UWP, похоже, не исправляло его.)

Ответ 1

Кажется, что процесс создания пакета работает. Будучи довольно отчаянным, я попытался использовать консоль С++ вместо С#, как в примере AppServiceBridgeSample_С++. Мне нужно было добавить файл Win32Process_CPP.exe в проект UWP и пометить его как Content с флагом Copy if newer. После этого успешно выполняется операция создания пакетов приложений. Но простое изменение С++-консоли обратно на С# привело к сбою снова - довольно странно!

Как я нашел, основная проблема известна и описана в docs:

Если вы предпочитаете использовать проект С# для упаковки своего приложения, вам необходимо осознавая следующие известные проблемы:

Файлы Win32, хранящиеся в корневой папке проекта UWP, удаляются в Release. Если вы не используете папку для хранения Win32 двоичные файлы, компилятор .NET Native удалит те из окончательного пакета, что приводит к ошибке проверки манифеста, поскольку исполняемый файл точка входа не найдена.

Решение этой проблемы было простым:

  • Создайте каталог (например, win32) в корне проекта UWP. Это место, где должно быть размещено консольное двоичное (BackgroundProcess.exe).

    Итак, вы получаете, например. c:\test\AppServiceBridgeSample\cs\UWP\win32

  • Отредактируйте элемент desktop:Extension в Package.appxmanifest - добавьте папку в значение атрибута Executable:

    <desktop:Extension Category="windows.fullTrustProcess" Executable="win32\BackgroundProcess.exe" />

  • Добавьте двоичный файл BackgroundProcess.exe из вновь созданной папки в проект UWP. В его свойствах установите атрибут BuildAction на Content и Copy to Output Directory на Copy if newer.

Теперь пакет должен быть создан.

Примечание. Если вы запустите AppCertKit (WACK) с созданным пакетом, вы можете получить отказ из-за использования пространства имен rescap (которое зарезервировано только для Microsoft и его поставщиков-партнеров, см. здесь). BinaryAnalyzer.AppContainerCheck, вероятно, также завершится неудачно, из-за вызова незащищенного двоичного файла.

Ответ 2

Я публикую здесь, потому что нашел свой собственный ответ после нескольких часов расследования. Надеюсь, это поможет другим в будущем!

Таким образом, проблема заключается в том, что BackgroundProcess.exe не включается в проект при создании пакета. Какие файлы, которые должны быть включены в проект, определены в файле .csproj. Откройте его в своем предпочтительном текстовом редакторе (не забудьте закрыть Visual Studio раньше)

Добавьте, где определены активы:

<ItemGroup>
  <Content Include="Properties\Default.rd.xml" />
  <Content Include="Assets\LockScreenLogo.scale-200.png" />
  <Content Include="Assets\SplashScreen.scale-200.png" />
  <Content Include="Assets\Square150x150Logo.scale-200.png" />
  <Content Include="Assets\Square44x44Logo.scale-200.png" />
  <Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />
  <Content Include="Assets\StoreLogo.png" />
  <Content Include="Assets\Wide310x150Logo.scale-200.png" />
</ItemGroup>

Что-то вроде этого:

<ItemGroup>
  <Content Include="Properties\Default.rd.xml" />
  <Content Include="Assets\LockScreenLogo.scale-200.png" />
  <Content Include="Assets\SplashScreen.scale-200.png" />
  <Content Include="Assets\Square150x150Logo.scale-200.png" />
  <Content Include="Assets\Square44x44Logo.scale-200.png" />
  <Content Include="Assets\Square44x44Logo.targetsize-24_altform-unplated.png" />
  <Content Include="Assets\StoreLogo.png" />
  <Content Include="Assets\Wide310x150Logo.scale-200.png" />
  <Content Include="AppServiceBridgeSample.BackgroundProcess.exe">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </Content>
</ItemGroup>

Обратите внимание, что я добавил AppServiceBridgeSample.BackgroundProcces.exe оспаривает пространство имен файла. Я не знаю, действительно ли это необходимо, но я это исправил. Поэтому, чтобы исправить пространство имен, вы должны добавить AppServiceBridgeSample перед всеми классами. А также в свойствах проекта BackgroundProcess в разделе Application > Имя сборки и пространство имен по умолчанию добавьте расширение.

Пример класса:

namespace AppServiceBridgeSample.BackgroundProcess
{
    class Program
    {
    ....
    }
}

И .xaml пример:

<Page
  x:Class="AppServiceBridgeSample.UWP.MainPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="using:AppServiceBridgeSample.UWP"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  x:Name="Main"
  mc:Ignorable="d">
  ...
</Page>

Кроме того, это не позволяет автоматически исправить ошибку, которую я имел, вам также нужно добавить Событие сборки, щелкните правой кнопкой мыши по BackgroundProcess (проект в VS) > свойствa > События сборки > В разделе Post-Build event command добавить:

xcopy /y /s "$(TargetPath)" "$(SolutionDir)UWP"

Создайте и разверните решение, и файл AppServiceBridgeSample.BackgroundProcess.exe должен присутствовать в корне проекта проекта UWP (отображается в проводнике файлов).

Кроме того, я обновился до Visual Studio 15 Enterprise Preview 3 во время этого исследования, которое, возможно, также помогло, если вы столкнулись с другими ошибками.

Ответ 3

Я не знаю, слишком ли поздно взвесить это, но я пытаюсь сделать что-то подобное. (Запуск PowerShell.exe) из приложения UWP. и это была ссылка, связанная со мной кем-то другим Desktop Bridged apps.

В вашем случае. Я указываю вас на первый абзац MS Doc по ссылке...

Щелкните правой кнопкой мыши файл Package.appxmanifest и просмотрите код. После того, как внутри XML файла убедитесь, что в пакетную область добавлены следующие пространства имен

      <Package
      ...
      xmlns:uap2="http://schemas.microsoft.com/appx/manifest/uap/windows10/2"
      xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
      xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
      ...
      IgnorableNamespaces="uap uap2 uap3 mp rescap desktop">