为什么WinRT不受pipe理?

Windows 8引入了WinRT,就像.NET一样,但是不受pipe理。 为什么它是不受pipe理的? 这是一个性能问题? 这是否意味着垃圾收集不适合较低级别的API?

WinRT是基于C语言的Winapi的替代品 。 这是一个必须在许多运行时环境中使用的api。 20年前,一个C API比较容易互操作。 从那时起,COM成为上世纪90年代后半期的万能胶。 实际上,Windows中常用的任何语言运行时都支持COM。

垃圾回收器是一种语言运行时实现细节。 .NET的收集器与Javascript的收集器非常不同。 在任一个中创build的本地对象都必须遵守收集器的非常严格的规则。 这又意味着他们将不得不创build特定于每个语言运行时的WinRT版本。 这是行不通的,甚至像微软那样大的公司也无法为每种语言绑定创build和支持特定的WinRT版本。 鉴于这些语言已经支持COM,也没有必要。

现在,WinRT的最佳绑定是C ++,因为COM通过显式的内存pipe理更有效地工作。 在新的C ++编译器扩展的帮助下,它可以自动生成,非常类似于使用类似C ++ / CLI的语法的旧_com_ptr_t来避免它。 绑定到托pipe语言是相对简单的,因为CLR已经有了很好的COM互操作支持。 WinRT也采用了.NET的元数据格式。 Afaik,截至今天,在托pipe编译器上完全没有工作。

编辑:知名的微软程序员和博主Larry Osterman,在现在被删除的答案中留下了相当好的评论。 我会在这里引用它来保存它:

WinRT是非托pipe的,因为操作系统是不受pipe理的。 通过按照devise的方式deviseWinRT,它获得了用许多不同语言expression的能力,不仅仅是C ++,C#和JS。 例如,我可以很容易地看到一套Perl模块,它们实现了在桌面上运行的WinRT API。 如果我们在.Net中实现它,那将是非常困难的

WinRT是非托pipe的,因为它旨在替代Win32 – Windows最低级开发人员可访问的API。 非托pipeAPI仍然是可以暴露给开发人员的最具潜力的API之一,并且推理总是可以将托pipeAPI包装在其上,这正是“预测”所做的。

这也意味着C ++开发人员可以使用WinRT,而无需跳过C ++ / CLI引入的喧嚣(请参阅http://www2.research.att.com/~bs/bs_faq.html#CppCLI )。这确实意味着您仍然可以如果你想使用WinRT,必须学习COM。

真正的问题是“为什么COM是必要的? 为什么微软必须发明它? 因为没有COM的所有附加function的普通C ++对于真正的OOP工作来说是不够的,Stroustrup声称的C ++给你的“可移植性”是非常不真实的。 见http://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/