17

我正在尝试部署示例应用程序以将 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中删除以下代码,Visual Studio 会成功构建包:

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

但这显然也将消除作为本练习重点的过程的桥接。

这似乎与这个问题有些相关,但不同之处在于我有一个 .exe,而这个问题似乎可以为 .dlls 回答它:

为商店构建通用应用程序时出错:“清单引用文件'MyAppName.dll',它不是有效负载的一部分。”

(更新 UWP 工具似乎并没有解决它。)

4

4 回答 4

9

我似乎让包创建工作。我已经非常绝望了,我尝试使用 C++ 控制台而不是 C#,就像在AppServiceBridgeSample_C++示例中一样。我只需要将Win32Process_CPP.exe文件添加到 UWP 项目并将其标记为Content带有Copy if newer标志。之后,创建应用程序包操作成功。但是只是简单地将 C++ 控制台更改回 C# 控制台再次导致失败 - 很奇怪!

正如我所发现的,主要问题是已知的并在文档中进行了描述:

如果您更喜欢使用 C# 项目来打包您的应用程序,则需要注意以下已知问题:

存储在 UWP 项目根文件夹中的 Win32 二进制文件在 Release 中被删除。如果您不使用文件夹来存储 Win32 二进制文件,.NET Native 编译器将从最终包中删除这些文件,从而导致清单验证错误,因为找不到可执行入口点。

这个问题的解决方案很简单:

  1. 在 UWP 项目根目录中创建一个目录(例如 win32)。这是必须放置控制台二进制文件 ( BackgroundProcess.exe) 的地方。

    所以你得到例如c:\test\AppServiceBridgeSample\cs\UWP\win32

  2. 编辑中的desktop:Extension元素Package.appxmanifest-将文件夹添加到Executable属性值:

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

  3. 将新创建的文件夹中的二进制文件添加BackgroundProcess.exe到 UWP 项目中。在其属性中将属性设置BuildActionContentCopy to Output DirectoryCopy if newer

现在应该创建包。

注意:如果您使用创建的包运行 AppCertKit (WACK),您可能会因使用rescap命名空间(仅为 Microsoft 及其合作伙伴供应商保留,请参阅此处)而失败。BinaryAnalyzer.AppContainerCheck由于调用了未受保护的二进制文件,它也可能会失败。

于 2017-05-31T13:01:32.180 回答
7

我在这里发帖是因为经过几个小时的调查后我找到了自己的答案。希望这将在未来对其他人有所帮助!

所以问题是在构建包时,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 。并且还在 Application > Assembly name & Default namespace 下的 BackgroundProcess 项目的属性中添加扩展。

示例类:

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>

此外,这不会自动修复我遇到的错误,您还必须添加一个Build Event,右键单击 BackgroundProcess (VS 中的项目) > properties > Build Events > 在 Post-Build events 命令行下添加:

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

构建和部署解决方案,并且 AppServiceBridgeSample.BackgroundProcess.exe 文件应存在于 UWP 项目根目录中(在文件资源管理器中可见)。

此外,我在这次调查期间更新到 Visual Studio 15 Enterprise Preview 3,如果您遇到其他错误,这可能也会有所帮助。

于 2016-08-13T14:02:34.473 回答
4

错误的路径会导致同样的错误。
对我来说,我的错误代码是

<Extensions>
    <desktop:Extension Category="windows.startupTask" EntryPoint="Windows.FullTrustApplication" Executable="ClipboardEx.exe">
      <desktop:StartupTask DisplayName="ClipboardEx" Enabled="true" TaskId="ClipboardExStartUpId"/>
    </desktop:Extension>
</Extensions>

我的项目目录是这样的:

bin
│  ├─x64
│  │  └─Release
│  │      ├─AppX
│  │      │  ├─ClipboardEx
|  |      |  |  └─ClipboardEx.exe
│  │      │  ├─Images
│  │      │  └─WinMetadata

所以我将 Executable 从 更改ClipboardEx.exeClipboardEx\ClipboardEx.exe,打包成功。
这有点像kibitzerCZ所说的。但我不需要创建一个新目录,只要确保你的路径是正确的

于 2020-05-31T03:56:15.543 回答
1

我不知道是否为时已晚,但我正在尝试做类似的事情。(运行 PowerShell.exe)从 UWP 应用程序。这是其他有关桌面桥接应用程序的人向我推荐的链接。

在你的情况下。我将您指向链接中 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">
于 2017-03-27T20:18:50.033 回答