如何实施WinRT/Metro应用程序限制?

jdm*_*jdm 2 executable microsoft-metro windows-8 windows-runtime

Windows 8中的新Metro风格/ WinRT应用程序对您可以调用的API有一定的限制.此外,你必须使用异步技术,你的应用程序必须是可暂停的等等.我想知道如何,如果所有这些都被强制执行.

新的Metro应用程序是可执行的程序,还是其他东西(例如,更像COM控件,具有一组已定义的接口)?如何在编译时,运行时(通过沙盒等)或仅通过Windows应用商店策略(类似于iOS中的情况)强制执行A​​PI限制?如果我感到狡猾,我是否可以获得屏幕处理和操作界面,在顶部添加浮动窗口,在后台启动某些内容,或以其他方式摆脱Metro的限制?

我问的一个原因是我正在考虑为Python创建一个WinRT库,以便可以使用它来编写Metro应用程序.但是,Python核心显然使用了很多非WinRT API调用,所以这可能从一开始就注定要失败.我还想了解Metro应用程序的解剖结构.


编辑:根据此线程,您可以使用C运行时的所有功能.看起来你可以编译调用禁用函数的东西,但"应用程序验证程序"抱怨.我想知道你是否可以运行这样一个混合应用程序,如果你不关心商店(也许以后通过编写forbidden函数的解决方法使其兼容)...

Jam*_*lis 5

Metro风格的 Windows应用商店应用程序可以执行(至少)两组不同的技术限制.

第一个是一组安全限制:Windows应用商店应用程序以低权限运行,因此在允许它们与系统其余部分进行交互方面受到限制.例如,Windows应用商店应用无法访问文件系统中的任意位置,它只能访问预定义位置集中的文件以及系统明确授予访问权限的文件.您不能违反这些安全限制(如果可以的话,那将是一个相当棘手的操作系统错误).

第二组限制是API分区.Windows应用商店应用仅允许调用应用程序分区中存在的系统功能.MSDN上每个系统函数的文档指定该功能是否存在于应用程序分区中.您还可以通过查找定义函数的头文件来查找:根据项目所针对的API分区有条件地定义函数:WINAPI_FAMILY宏控制它(有关详细信息,请参阅Windows SDK中的winapifamily.h).

如果您调用"未批准"功能,则结果未定义.它似乎可行; 它可能会灾难性地失败.它可能看起来今天工作正常并且明天会失败(或者在应用Windows更新之后,或者使用下一版本的Windows).

API分区以各种方式实施.构造头部使得难以调用未批准的功能.如果您自己定义该功能或更改该功能WINAPI_FAMILY,您的应用将无法通过Windows应用认证工具包(WACK)流程.我的理解是CLR禁止在运行时调用未经批准的.NET功能,尽管我不太熟悉.NET限制.在任何情况下,我的理解是,如果您的应用程序调用未经批准的功能,则无法按照"Windows 8应用程序认证要求"将其提交到商店(请自行阅读这些要求;我没有详细阅读它们,我当然不能为你解释它们).

如果您不关心将应用程序提交到Windows应用商店,或者只是想编写一些测试应用程序或使用WinRT,那么没有什么可以阻止您尝试调用未经批准的功能.例如,我发现为调试目的创建控制台窗口很有.这似乎工作正常,我不太关心它是否未通过Windows Store认证,因为它仅用于调试和测试.