【问题标题】:UWP LaunchFullTrustProcessForCurrentAppAsync - EXE file not foundUWP LaunchFullTrustProcessForCurrentAppAsync - 找不到 EXE 文件
【发布时间】:2019-02-14 09:08:22
【问题描述】:

我们正在创建一个仅用于侧面加载的 UWP 应用程序。 在不同的时间,这个应用程序需要重启 PC(它只是桌面),为此我们打算使用 LaunchFullTrustProcessForCurrentAppAsync() 来调用一个简单的外部 EXE,它使用 Process.Start("shutdown") 来重启 PC。

我们已经创建了名为 RebootPC.exe 的 EXE,它本身就可以正常工作。

我们现在将它包含在我们的 UWP 项目中:

首先我们将桌面和 rescap 命名空间添加到我们的项目中,我们还将 rescap 添加到我们的 IgnorableNamspaces

xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10" 
     xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" 
     IgnorableNamespaces="uap mp uap5 rescap">

然后,我们修改扩展部分以包含我们的 EXE,我们知道我们不能将 EXE 放在项目根目录中,因为 C# 编译器将其删除,因此我们将其放在子文件夹中(在本例中为 \Assets)。我们还在解决方案资源管理器中将 EXE 的类型设置为“内容”和“始终复制”

<desktop:Extension Category="windows.fullTrustProcess" Executable="Assets\RebootPC.exe">
      <desktop:FullTrustProcess>
        <desktop:ParameterGroup GroupId="rebooter" Parameters=""/>
      </desktop:FullTrustProcess>
    </desktop:Extension>

最后在清单中,我们将 rescap 添加到 Capabilities 部分 - 我们知道它必须位于列表的首位,否则在打包时会出现清单错误

<Capabilities>
<rescap:Capability Name="runFullTrust"/>
<Capability Name="internetClient" />
<DeviceCapability Name="bluetooth" />
<DeviceCapability Name="radios" />

好的,因此清单已更改。我们现在转到我们的 C# 代码:

我们执行以下操作:

if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", 1, 0))
            {
                try
                {
                    await Windows.ApplicationModel.FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync();

                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.Message);
                }

            }

当我们在 Visual Studio 中构建和运行项目时,它似乎工作正常,在预期的情况下,PC 将按预期重新启动。

当我们尝试将其打包以安装在其他 PC 上时,问题就出现了。我们使用 Store->Create App Packages(请记住,此应用程序仅用于侧面加载)。

包的创建工作正常,我们可以毫无问题地将其安装在其他 PC 上。问题是,当我们运行应用程序并且需要运行外部 EXE 以重新启动 PC 时,会打开一个命令窗口,但我们会收到异常提示“系统找不到 c:\users.......\资产\RebootPC.exe"

因此,即使打包完成没有错误,即使我们将 RebootPC.exe 的属性设置为“内容”和“始终复制”,它也没有包含在包中,或者没有与应用?

那么,有谁知道我们如何检查它是否包含在包中?如果是这样,我们如何检查它是否以及安装在目标机器上的位置?或者有其他人遇到过这个问题并找到了解决方案吗?

这让我们困惑了好几天,快把我们逼疯了!!!

更新:我认为问题可能不在于找不到 RebootPC.exe,而是在于 shutdown.exe - 如果是这种情况,那么这有点像小学生的错误!!! 无论如何,我会对此进行排序,看看是否能解决问题

剩下的问题我会留下来,因为它可能会为其他人提供有用的信息

【问题讨论】:

  • 确保您的 exe 在您项目的 appx 文件夹中,它将正常工作。 *Project*/bin/x86/debug/Appx 并将 Executable="Assets\RebootPC.exe" 更改为 Executable="RebootPC.exe"。这为我解决了问题

标签: c# uwp


【解决方案1】:

正如官方示例中提到的,exe 文件必须在项目的 Appx 文件夹中

确保将 RebootPC.exe 复制到 Appx 文件夹 - UWP\bin\x64\Release\AppX 如果不重建解决方案或复制它 手动。

https://github.com/Microsoft/DesktopBridgeToUWP-Samples/tree/master/Samples/AppServiceBridgeSample#builddeploy-and-run-the-sample

【讨论】:

    【解决方案2】:
                try
                {
                    await Windows.ApplicationModel.FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync("rebooter");
    
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.Message);
                }
    
            }
    

    【讨论】:

    • 您应该解释您的答案如何以及为什么会有所帮助。您可能还应该包含一个免责声明,即捕获所有异常是一种反模式
    猜你喜欢
    • 2012-01-26
    • 2018-06-11
    • 2017-12-06
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多