WinRT上的C ++,C#和JavaScript

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

Windows 8平台和工具http://sofzh.miximages.com/c%23/windows8-platform-tools_2.jpg

  1. 他们在WinRT上的C ++,C#和JavaScript有什么不同,例如性能,function,function等。
  2. 如何使用JavaScript创建本地 Metro App,我是否需要使用MS中的js库,或者我可以使用我熟悉的任何js,例如jQuery。
  3. 在Metro风格的App中,System Services只是WinRT,这是否意味着我不能再使用低级别的dll了? 这会带来性能成本吗?

关于#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接口。 只要它们在IE10中工作,现有的JS库通常可以在没有或只需要很少的努力的情况下重复使用。

.NET(C#/ VB) – 中级,静态类型,可选动态类型( dynamic关键字等)和GC。 XAML UI框架是UI的默认框架,但您也可以使用WebView控件来使用HTML。 提供对WinRT库的完全访问权限,但也有一些自己的权限,有时使用起来更方便(例如Stream vs 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而没有阻抗不匹配 – 因此引用计数 – 但仍然高到足以避免样板并且通常可以安全使用(例如exception而不是HRESULT,看到的字符串作为对象而不是句柄, dynamic_cast而不是QueryInterface等)。 您和WinRT之间没有其他图层,代理对象等,所有通话都是直接的。 在大多数情况下,三者中最快,尽管确切的差异根据具体任务而有很大差异,对于某些人来说可能是微不足道的(例如,没有计算或很少计算的事件驱动应用程序),而对其他人来说则相当可观(例如解析或重数学) )。 UI故事与.NET相同。 此外,您可以获得整个C ++标准库,以及ATL的子集。 可以编写自己的WinRT组件,然后可以从JS或.NET使用它们。 现有的C ++库可能很容易重用,也可能不容易重用,具体取决于它们使用的API; 严格依赖标准C / C ++的那些通常不会有任何变化,而那些调用Win32 API的人如果依赖Metro app容器中不可用的API则可能会出现问题。


关于#3,这个video – http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C – 应该回答你关于Win32使用的大部分问题(我认为“低级DLL”意味着什么来自Metro应用程序。 请注意,虽然video是关于C ++的,但这也完全适用于C#,因为P / Invoke和COM Interop仍然存在。 因此,如果您可以从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?

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

不过我认为它可以做到:

  • 选择你所知道的
  • 选择允许您重复使用最多代码的内容

所以

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

该video演示了如何从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正式推出一年多了:目前还没有办法说明最终版本中具体的“function”和“function”。