使用指向可执行文件的"fullTrustProcess"创建应用程序包时出现错误

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 文件,而那个问题似乎是针对 .dll 的:

构建通用应用程序以供商店使用时出错:“清单引用文件‘MyAppName.dll’,但该文件不是有效负载的一部分。”

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

5个回答

12

看起来我已经成功创建了程序包。由于已经非常绝望,我尝试使用 C++ 控制台而不是 C#,就像在AppServiceBridgeSample_C++样例中一样。 我只需将Win32Process_CPP.exe文件添加到 UWP 项目中,并使用 ContentCopy if newer 标记标记它。之后,创建应用程序包操作成功。

但是,只是将 C++ 控制台简单地切换回 C# 就导致了再次失败 - 这很奇怪!

据我发现,主要问题已知并在文档中进行了描述:

如果您想使用 C# 项目打包应用程序,则需要了解以下已知问题:

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

解决此问题很简单:

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

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

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

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

  3. 将新建文件夹中的BackgroundProcess.exe二进制文件添加到您的UWP项目中。在其属性中,将BuildAction属性设置为Content,将Copy to Output Directory设置为Copy if newer

现在应该创建包了。

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


非常感谢这个解决方案。非常简单而且有效。 - Caesar
我做了所有这些,但似乎当我只使用MakeAppx时,它可以工作 - 可以创建包,但是当我使用MSBuild时,其中包含MakeAppx,相同的参数,相同的路径,仍然抱怨找不到.exe文件。 - spspli

9

我在这里发布帖子,因为经过数小时的调查后,我找到了自己的答案。希望这能帮助未来的其他人!

所以问题是,在构建包时未将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>Assembly name&Default namespace扩展名。
示例类:
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中的项目)>属性>构建事件>在后期构建事件命令行下添加:
xcopy /y /s "$(TargetPath)" "$(SolutionDir)UWP"

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

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


我按照您的步骤进行了操作,但仍无法部署应用程序。如果您还有可部署的解决方案,请分享在线上。 - Harsha

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

所以我把可执行文件从ClipboardEx.exe改为ClipboardEx\ClipboardEx.exe后,打包成功了。
这有点像kibitzerCZ所说的。但是我不需要创建一个新目录,只需要确保你的路径正确就行了。


这正是我的情况。附加了文件夹名称(与exe同名),它就可以工作了。其他的解决方法虽然也能起作用,但会引起其他问题。 - Code

1
我不知道是否为时已晚,但我正在尝试做类似的事情(从UWP应用程序运行PowerShell.exe),有人提供了一个链接桌面桥接应用程序
在你的情况下,我会指向链接中MS文档的第一段...
右键单击Package.appxmanifest文件并查看代码。进入XML文件后,请确保将以下命名空间添加到Package部分。
      <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">

1
为什么我们需要这个uap2和uap3? - spspli

0

我可能找到了一个非常简单的解决方案。我遇到了完全相同的错误:“为元素声明的文件名...在包中不存在”。

这似乎是两个“可执行文件”条目之间的冲突。第一个在应用程序标签下,第二个在新扩展标签下。 我删除了第二个并且它起作用了。

我还没有发布这个版本,但到目前为止,我所有的测试都通过了。计算机重新启动后,应用程序会自动启动。这个“快捷方式”会在以后影响我吗?其他人试过吗?这个解决方案似乎太简单了,难道就是正确的吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接