30

从下图中,Windows 8 平台和工具。我知道这意味着我可以将 C++、C# 或 JavaScript 用于 Metro 风格的应用程序。我还观看了一些构建的主题演讲,在这里我有几个问题。

Windows 8 平台和工具 http://www.windowsitpro.com/content/content/140554/windows8-platform-tools_2.jpg

  1. 它们在 WinRT 上的 C++、C# 和 JavaScript 是否有任何差异,例如性能、特性、功能等。
  2. 如何使用 JavaScript 创建本机Metro App,我需要使用 MS 的 js 库还是可以使用我熟悉的任何 js,例如 jQuery。
  3. 在 Metro 风格的 App 中,系统服务只有 WinRT,这是否意味着我不能再使用低级 dll 了?这会带来性能成本吗?
4

6 回答 6

45

关于#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 库的完全访问,但也提供一些它自己的库,有时使用起来更方便(例如Streamvs IInputStream/ IOutputStream)。此外,唯一一个包含对异步操作的特殊语言级别支持(asyncawait关键字),由于其高度异步设计,在使用 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而不是QueryInterfaceETC)。您和 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# 调用它。

于 2011-09-19T05:11:51.943 回答
3

1) 允许语言选择的目的是让您选择一种语言,因为它具有该语言的内在优势,而不是因为它是访问 API 的唯一方式。如果您喜欢动态语言,请选择 JavaScript。如果您喜欢静态类型,但不想处理内存,请使用 C#。如果您想要最快的执行速度(但最有能力击中自己的脚),请选择 C++。

2)这取决于您所说的本地人的意思。如果您只是想让它们看起来像 Metro 风格的应用程序,最好的方法是使用开发人员预览 SDK 附带的 WinJS 库。

3) WinRT 使您能够从 JavaScript 代码编写和调用自己的 C++ DLL 或 C# 程序集。限制是您必须将 DLL 公开为 WinRT 对象,并且您不能调用任何不允许在 Metro 风格应用程序中使用的函数。

于 2011-09-19T04:28:18.127 回答
2

其他人已经解释了3个选项之间的区别,所以我不再重复。

但是我认为这样做是为了:

  • 选择知道的
  • 选择让您重用最多代码的内容

所以

  • 如果您是 .net 程序员,请使用 C# 或 VB.Net
  • 如果您要从 Windows Phone 移植应用程序,请使用 C# 或 VB.NET
  • 如果您有大量 C++ 代码库,请考虑将非托管 C++ 与 WinRT 结合使用
  • 如果您有一个网站并希望提供它的离线版本,您可以通过使用 JavaScript 和 HTML 来获得良好的代码(和技能)重用
  • 如果喜欢 JavaScript 和 HTML,但不喜欢 .Net,请使用……。
  • ETC
于 2011-09-24T21:13:47.770 回答
2
  1. 与他们一直以来的差异相同。没有自动内存管理,就没有 C# 之类的东西。托管语言将一如既往地具有类似的开销。

  2. 如果它运行 Javascript,您应该能够使用 jQuery(它是纯 javascript)。您可能需要调用一些 MS 函数进行初始化等,但现有的脚本函数应该仍然运行。

  3. 我见过的最可靠的消息来源表明(至少大部分)WinRT 位于 Win32 之上。那个“Windows 内核服务”块是 Win32 的kernel32.dll. Metro 中没有使用一些上层 Win32 的东西,但有什么应用程序曾经使用过所有的 Win32?

于 2011-09-19T04:06:14.060 回答
1

该视频展示了如何从 JScript 调用您自己的 C++ 代码:

http://channel9.msdn.com/posts/Raman-Sharma-Building-Metro-Style-Apps-with-C-and-JavaScript

于 2011-09-26T00:16:36.767 回答
0

建议:

  • 为什么不下载开发者预览版并自己寻找:

http://msdn.microsoft.com/en-us/windows/apps/br229516

事实:

  • 当然,您仍然可以使用 Win32 .dll(在某个级别或其他级别),就像您可以使用 .Net 一样。

  • Windows 8 正式发布一年多:目前还没有办法说最终版本中会有哪些特定的“特性”和“功能”。

于 2011-09-19T04:11:05.387 回答