【发布时间】: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"。这为我解决了问题