C++, C# and JavaScript on WinRT

C++, C# and JavaScript on WinRT

本文关键字:on WinRT JavaScript and C++      更新时间:2023-09-26

从下图来看,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应用程序,我需要使用MS的js库还是我可以使用我熟悉的任何js,例如jQuery。
  3. 在Metro风格的应用程序中,系统服务只有WinRT,这是否意味着我不能再使用低级dll了?这会带来性能成本吗?

关于#1,排列大致如下:

JavaScript -最高级,动态类型,GC。你只能使用HTML5/CSS为你的UI, XAML框架(Windows.UI.XAML命名空间)是不可用的。除了提供WinRT的可用表面之外,还提供了一些标准的JS api(由HTML5指定),例如本地存储或IndexedDB。作为动态类型,繁重的cpu绑定处理可能比。net或c++慢,尽管JS引擎由于jit编译和大量优化仍然非常快。你可以使用c++和。net WinRT组件,但不能用JS编写自己的组件。语言投射的某些方面似乎受到了相应的限制——例如,据我所知,没有办法在JS中实现WinRT接口。现有的JS库通常可以被重用,只要它们在IE10中工作就可以。

。. NET (c#/VB) -中级,静态类型,可选动态类型(dynamic关键字等)和GC。XAML UI框架是UI的默认框架,但您也可以使用HTML使用WebView控件。提供对WinRT库的完整访问,但也有一些自己的库,有时更方便使用(例如Stream vs IInputStream/IOutputStream)。此外,它也是唯一一个包含对异步操作(asyncawait关键字)的特殊语言级支持的版本,由于其高度异步的设计,在使用WinRT api时大量使用这些关键字。一般来说,它提供了大多数语法糖——除了异步的东西,你得到了LINQ对象(它在WinRT集合上工作)。可以编写自己的WinRT组件,然后可以从JS或c++/CX中使用。现有的。net库可能会也可能不会被重用,这取决于它们所依赖的。net框架中的哪些类;为Silverlight或WP7编写的组件最有可能是可重用的,不需要或只需要很少的更改,而为。net 4 Full或Client Profile编写的组件可能需要进行重大更改才能运行。

c++/CX (Visual c++组件扩展)-低/中级,静态类型,无GC -仅重计数。最接近"金属",因为它的对象模型被设计成直接映射到WinRT,没有阻抗不匹配-因此重新计数-但仍然足够高级,可以避免模板,并且通常可以安全使用(例如异常而不是HRESULTs,字符串被视为对象而不是句柄,dynamic_cast而不是QueryInterface等)。在你和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 -应该回答您关于Metro应用程序使用Win32(我假设"低级DLL"意味着什么)的大多数问题。请注意,虽然视频是关于c++的,但这也完全适用于c#,因为P/Invoke和COM互操作仍然存在。所以如果你可以从c++调用它,你也可以从c#调用它

1)允许语言选择的重点是让您根据语言的内在优势来选择语言,而不是因为它是访问API的唯一方法。如果您喜欢动态语言,请选择JavaScript。如果你喜欢静态类型,但又不想处理内存问题,那就使用c#吧。如果你想要最快的执行速度(但又最有可能搬起石头砸自己的脚),选择c++。

2)这取决于你对原生的定义。如果你只是想让它们看起来像Metro风格的应用,最好的方法是使用开发者预览SDK附带的WinJS库。

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

  1. 他们一直有相同的差异。没有自动内存管理就没有c#这种东西。托管语言将有类似的开销。

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

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

其他人已经解释过这三种选择井之间的区别,所以我就不再重复了。

然而,我认为这样做是为了:

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

  • 如果你是一个。net程序员,那么使用c#或VB。净
  • 如果你是从windows phone移植应用程序,使用c#或VB。净
  • 如果你有一个大的c++代码库,那么考虑使用WinRT的非托管c++
  • 如果你有一个网站,并希望提供它的离线版本,你可以通过使用JavaScript和HTML获得良好的代码(和技能)重用
  • 如果你喜欢JavaScript和HTML,但不喜欢。net,那么使用....

这个视频展示了如何从JScript调用自己的c++代码:

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

建议:

  • 你为什么不下载开发者预览版自己看看呢:
http://msdn.microsoft.com/en-us/windows/apps/br229516

事实:

  • 当然你仍然可以使用Win32 .dll(在一个或另一个级别),就像你可以使用。net一样。

  • Windows 8正式发布一年多了:目前还没有办法说最终版本中会有哪些具体的"功能"answers"功能"。