无头地运行地铁应用程序

时间:2012-04-16 17:56:18

标签: file-io windows-8 microsoft-metro headless

我遇到了一些障碍,我希望有人可以提供帮助!

我编写了一个用作单元测试运行器的metro应用程序,现在我需要能够无头地调用此应用程序,以便它可以在构建过程中用于验证。 metro应用程序的工作方式是运行一系列单元测试,生成包含测试结果的XML文件,并将结果显示给用户。

理想情况下,我会有一个简单的脚本来运行metro应用程序,执行测试,退出应用程序,然后能够在生成的XML文件中读取结果。这是可能的,如果是这样,最好的方法是什么?

以下是一些更具体的问题:

  1. 如何以无头方式启动Metro应用程序,在metro应用程序中是否有一种方法可以检测到这一点,以便它不会等待用户输入?

  2. 是否可以从外部流程访问metro应用程序包中的文件?

  3. 编辑 - 解决方法是创建自定义Visual Studio测试运行器,然后找到一种方法来自动运行每个构建的测试。我知道这可以在IDE中完成,但我不确定是否有办法用脚本执行此操作。

3 个答案:

答案 0 :(得分:4)

我想你很久以前就已经解决了这个问题,但是为了其他任何想要做到这一点的人,我没有太多麻烦就让它工作了。为了以自动/无头的方式执行Metro应用程序,我编写了一个简单的桌面命令行实用程序,它使用metro应用程序的名称并使用IApplicationActivationManager界面启动它。然后我可以从脚本中调用该实用程序。

该接口的ActivateApplication方法的第二个参数是一个字符串,它被传递给激活的应用程序,有点像命令行参数。它显示为应用程序Arguments处理程序收到的LaunchActivatedEventArgs的{​​{1}}属性。 Visual Studio模板项目中OnLaunched的默认实现在第一次导航到OnLaunched时将其传递给MainPageOnNavigatedTo处理程序将Parameter作为NavigationEventArgs处理程序传递给%LOCALAPPDATA%\Packages\APPNAME\LocalState {{1}}的属性。你可以在任何更方便的地方捕捉它。

我的启动器实用程序通过那里传递硬编码标志,以及转发自己的命令行参数。这允许顶级脚本将任意数据传递到Metro应用程序。该应用程序可以使用该数据来实现它无头运行并运行其测试。它可以将您喜欢的任何类型的结果数据吐出到其中一个文件夹(例如LocalFolder),然后桌面应用可以从{{1}}读取。我设置我的启动器实用程序以等待启动应用程序后显示结果文件,然后使用它们来确定自己的退出代码。启动器实用程序之后无法杀死应用程序,但应用程序可以通过CoreApplication.Exit完成后自行终止。

该设置在一段时间内运行良好,但我现在遇到的一个问题是应用程序并不总是启动到前台,并且运行时将暂停/终止应用程序前景应用程序一段时间(目前约10-15秒)。因此,任何花费太长时间的测试都无法使用这种方法,除非我还没有发现一些解决方法(当我遇到这个问题时我正在搜索)。

答案 1 :(得分:1)

我怀疑你能不能做到。

这与尝试无头地运行WPF应用程序的问题相同,但更难,因为您还必须处理Metro沙箱安全模型。

P.S。很高兴被证明是错误的!

答案 2 :(得分:0)

不,抱歉。你首先要求的是首先以“无头”模式运行Metro应用程序的脚本。你的第二个要求是你的下一个墙。一个应用程序无法查看,更不用说监视另一个应用程序/线程/进程。那你的第三个要求也是不可能的。应用程序内的文件是隔离的。听起来我觉得你找到了一个适合桌面应用的好人选。话虽如此,不要错误地认为您不能拥有作为仪表板的伴侣Metro应用程序。只是执行核心不能托管在WinRT沙箱中。