我想你早就解决了这个问题,但是为了其他人想要这样做,我让它工作起来没有太多麻烦。为了以自动化/无头方式执行 Metro 应用程序,我编写了一个简单的桌面命令行实用程序,它采用 Metro 应用程序的名称并使用IApplicationActivationManager接口来启动它。然后我可以从脚本中调用该实用程序。
该接口的ActivateApplication方法的第二个参数是传递给激活的应用程序的字符串,有点像命令行参数。它显示为应用程序处理程序接收到的Arguments属性。Visual Studio 模板项目中的默认实现将此值传递给第一次导航到它时,它作为. 你可以在任何一个更方便的地方抓住它。LaunchActivatedEventArgsOnLaunchedOnLaunchedMainPageOnNavigatedToParameterNavigationEventArgs
我的启动器实用程序通过那里传递一个硬编码的标志,以及转发它自己的命令行参数。这允许顶级脚本将任意数据向下传递到 Metro 应用程序。该应用程序可以使用该数据来实现它正在无头运行并运行其测试。它可以将你喜欢的任何类型的结果数据吐到它的一个文件夹中(比如它的LocalFolder),然后桌面应用程序可以从中读取%LOCALAPPDATA%\Packages\APPNAME\LocalState。我将启动器实用程序设置为在启动应用程序后等待结果文件出现,然后使用它们来确定自己的退出代码。启动器实用程序之后无法终止应用程序,但应用程序可以在通过CoreApplication.Exit完成时自行终止。
该设置在一段时间内运行良好,但我现在遇到的一个问题是应用程序并不总是启动到前台,并且运行时将在它不是前台应用程序后暂停/终止应用程序一些时间(目前约 10-15 秒)。因此,任何需要太长时间的测试都不适用于这种方法,除非我还没有发现一些解决方法(当我遇到这个问题时我正在寻找它)。