Windows 8引入了WinRT,它类似于.NET但不受管理。为什么不受管理?这是性能问题吗?这是否意味着垃圾回收不适用于较低级别的API?
Windows 8引入了WinRT,它类似于.NET但不受管理。为什么不受管理?这是性能问题吗?这是否意味着垃圾回收不适用于较低级别的API?
Answers:
WinRT 替代了古老的基于C的Winapi。它是必须在许多运行时环境中使用的api。早在20年前,C api相对易于互操作。从那时起,这种情况一直在发展,COM成为1990年代后半叶的通用粘合剂。实际上,Windows中常用的任何语言运行库都支持COM。
垃圾收集器是语言运行时实现的详细信息。例如,.NET的收集器与Javascript的收集器有很大不同。在任何一个中创建的本机对象必须遵守收集器的非常严格的规则。反过来,这意味着他们将不得不创建特定于每种语言运行时的WinRT版本。那是行不通的,即使像Microsoft这样大的公司也负担不起为每种语言绑定创建和支持特定的WinRT版本。鉴于这些语言已经支持COM,所以也没有必要。
目前,WinRT的最佳绑定是C ++,因为COM通过显式的内存管理可以更有效地工作。在新的C ++编译器扩展的充分帮助下,该扩展使其自动运行,非常类似于使用++ / CLI语法的旧_com_ptr_t来避免它。绑定到托管语言相对简单,因为CLR已经具有出色的COM互操作支持。WinRT还采用了.NET的元数据格式。Afaik,到目前为止,在托管编译器上还没有完成任何工作。
编辑:著名的Microsoft程序员和博客作者Larry Osterman在一个已删除的答案中留下了相当不错的评论。我在这里引用它来保存它:
WinRT不受管理,因为操作系统不受管理。通过按设计方式设计WinRT,它具有用多种不同语言(不仅仅是C ++,C#和JS)表达的能力。例如,我可以很容易地看到一组Perl模块,这些模块实现了可在桌面上运行的WinRT API。如果我们在.Net中实现它,那将非常困难
IInspectable
让您执行诸如查询对象的实际类类型或所有受支持接口的列表之类的操作,并使用winmd文件可以将WinRT元数据将其投射到Reflection中)。而且winmd文件也不能立即用作互操作程序集,CLR必须专门处理它们。
WinRT不受管理,因为它打算替代Win32-Windows最低级别的开发人员可访问的API。不受管理的API仍然是最有可能表现给开发人员的一种,其推理是,始终可以将受管API封装在其之上,这正是“投影”所做的。
这也意味着C ++开发人员可以使用WinRT,而无需跳过C ++ / CLI引入的麻烦(请参阅http://www2.research.att.com/~bs/bs_faq.html#CppCLI),这确实意味着您仍然可以如果要使用WinRT,必须学习COM。
真正的问题是“为什么需要COM?微软为什么要发明它?” 因为没有COM的所有附加功能的纯C ++不足以进行真正的OOP工作,并且Stroustrup声称C ++为您提供“可移植性”对于实际工作而言是非常卑鄙的。参见http://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/