关于#1,阵容大致如下:
JavaScript - 最高级别的动态类型 GC。您的 UI 只能使用 HTML5/CSS,XAML 框架(Windows.UI.XAML
命名空间)不可用。除了 WinRT 的可用表面之外,还提供一些标准的 JS API(由 HTML5 指定),例如本地存储或 IndexedDB。作为动态类型,繁重的 CPU 密集型处理可能比 .NET 或 C++ 慢,尽管由于 JIT 编译和高度优化,JS 引擎仍然非常快。您可以使用 C++ 和 .NET WinRT 组件,但不能用 JS 编写自己的组件。语言投影的某些方面似乎受到了相应的限制——例如,据我所知,没有办法在 JS 中实现 WinRT 接口。现有的 JS 库通常可以毫不费力地重用,只要它们在 IE10 中工作即可。
.NET (C#/VB) - 中级,静态类型,可选动态类型(dynamic
关键字等)和 GC。XAML UI 框架是 UI 的默认框架,但您也可以通过WebView
控件使用 HTML。提供对 WinRT 库的完全访问,但也提供一些它自己的库,有时使用起来更方便(例如Stream
vs IInputStream
/ IOutputStream
)。此外,唯一一个包含对异步操作的特殊语言级别支持(async
和await
关键字),由于其高度异步设计,在使用 WinRT API 时会大量使用。一般来说,它提供了大多数语法糖——除了异步的东西,你可以得到 LINQ 到对象(它在 WinRT 集合上工作)。可以编写自己的 WinRT 组件,然后可以从 JS 或 C++/CX 中使用。现有的 .NET 库可能会或可能不会很容易地重用,这取决于它们所依赖的 .NET Framework 中的类;为 Silverlight 或 WP7 编写的组件最有可能无需更改或只需很少更改即可重用,而为 .NET 4 Full 或 Client Profile 编写的组件可能需要进行重大更改才能运行。
C++/CX(Visual C++ 组件扩展) - 低/中级,静态类型,无 GC - 仅引用计数。最接近“金属”,因为它的对象模型被设计为直接映射到 WinRT,没有阻抗不匹配——因此是引用计数——但仍然足够高级,可以避免样板文件并且通常可以安全使用(例如,异常而不是 HRESULT,看到的字符串作为对象而不是句柄,dynamic_cast
而不是QueryInterface
ETC)。您和 WinRT 之间没有额外的层、代理对象等,所有调用都是直接的。在大多数情况下,这三者中最快的,尽管确切的差异取决于具体任务而有很大差异,并且对于某些(例如,没有或很少计算的事件驱动应用程序)来说可能是微不足道的,而对于其他人(例如解析或繁重的数学)来说可能是相当大的)。UI 故事与 .NET 相同。此外,您还可以获得整个 C++ 标准库,以及 ATL 的一个子集。可以编写自己的 WinRT 组件,然后可以从 JS 或 .NET 中使用。现有的 C++ 库可能容易重用,也可能不容易重用,这取决于它们使用的 API;那些严格依赖标准 C/C++ 的程序通常无需任何更改即可工作,而那些调用 Win32 API 的程序如果依赖于 Metro 应用程序容器中不可用的 API,则可能会出现问题。
关于#3,这个视频 - http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C - 应该回答你关于使用 Win32 的大部分问题(我认为“低级 DLL”是什么意思) 来自 Metro 应用程序。请注意,虽然视频是关于 C++ 的,但这也完全适用于 C#,因为 P/Invoke 和 COM 互操作仍然存在。因此,如果您可以从 C++ 调用它,那么您可以从 C# 调用它。