【问题标题】:Error while creating app package with "fullTrustProcess" pointing to a executable使用指向可执行文件的“fullTrustProcess”创建应用程序包时出错
【发布时间】:2016-12-18 14:02:49
【问题描述】:

我正在尝试部署示例应用程序以将 AppServices 与 UWP 应用程序连接起来。示例运行和构建都很好,但是当我尝试按照指南打包整个东西时,它给了我一个错误。

Link to the packaging guide

AppService Bridge Sample repository here.

错误信息:

 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.

我找到了生成错误的 code-sn-p,但我还没有找到修复它的方法。

如果我从 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 回答:

Error when building universal app for the store: "Manifest references file 'MyAppName.dll' which is not part of the payload."

(更新 UWP 工具似乎没有修复它。)

【问题讨论】:

    标签: c# xaml uwp windows-10-universal desktop-bridge


    【解决方案1】:

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

    所以问题是在构建包时,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>
    

    这也不会自动修复我遇到的错误,您还必须添加一个 构建事件,右键单击 BackgroundProcess(VS 中的项目)> 属性 > 构建事件 > 在 Post-Build 下事件命令行添加:

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

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

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

    【讨论】:

    • 我已按照您的步骤操作,但仍然无法部署应用程序。如果您仍然有可部署的解决方案。能否请您在线分享。
    【解决方案2】:

    我不知道是否为时已晚,但我正在尝试做类似的事情。 (运行 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">
    

    【讨论】:

    • 为什么我们需要这个 uap2 和 uap3?
    【解决方案3】:

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

    正如我所发现的,主要问题在docs 中是已知和描述的:

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

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

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

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

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

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

      &lt;desktop:Extension Category="windows.fullTrustProcess" Executable="win32\BackgroundProcess.exe" /&gt;

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

    现在应该已经创建了包。

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

    【讨论】:

    • 非常感谢这个解决方案。非常简单有效。
    • 我做了所有这些,但似乎当我单独使用 MakeAppx 时,它可以工作 - 可以创建包,但是当我使用 MSBuild 时,它包含 MakeAppx,相同的参数,相同的路径,仍然抱怨找不到.exe
    【解决方案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.exe改成了ClipboardEx\ClipboardEx.exe,打包成功。
    这有点像kibitzerCZ所说的。但我不需要创建一个新目录,只要确保你的路径是正确的

    【讨论】:

    • 这正是我的情况。附加文件夹名称(与 exe 相同的名称),它工作。其他解决方法有效,但导致了其他问题。
    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2017-03-08
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多