C++, C# and JavaScript on WinRT
C++, C# and JavaScript on WinRT
从下图来看,Windows 8平台和工具。我知道这意味着我可以使用c++, c#或JavaScript Metro风格的应用程序。我也观看了一些构建的主题演讲,我有几个问题在这里。
Windows 8平台和工具http://www.windowsitpro.com/content/content/140554/windows8-platform-tools_2.jpg
- 它们在WinRT上的c++、c#和JavaScript有什么不同吗,比如性能、特性、能力等等
- 如何使用JavaScript创建本机 Metro应用程序,我需要使用MS的js库还是我可以使用我熟悉的任何js,例如jQuery。
- 在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
)。此外,它也是唯一一个包含对异步操作(async
和await
关键字)的特殊语言级支持的版本,由于其高度异步的设计,在使用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风格的应用程序中使用的函数。
-
他们一直有相同的差异。没有自动内存管理就没有c#这种东西。托管语言将有类似的开销。
-
如果它运行Javascript,你应该能够使用jQuery(这是纯Javascript)。您可能需要调用一些MS函数进行初始化等,但现有的脚本函数应该仍然可以运行。
-
我所见过的最可靠的消息来源表明(至少大部分)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
建议:
- 你为什么不下载开发者预览版自己看看呢:
事实:
当然你仍然可以使用Win32 .dll(在一个或另一个级别),就像你可以使用。net一样。
Windows 8正式发布一年多了:目前还没有办法说最终版本中会有哪些具体的"功能"answers"功能"。
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 是否可以用C++/WinRT将windows 10.0.14393作为目标
- 将 win32 hbitmap 转换为 winrt softwarebitmap
- 升级到 Windows 10 版本 1809 SDK 后,我无法编译使用 C++/WinRT 的项目
- 尝试从 XamlApplication 编译 C++/WinRT 空白应用程序时,我收到未解析的外部符号 winrt_make_*
- 在 Winrt/C++ 中使用应用服务
- 循环挂起迭代的 std::擦除 on std::list
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- 无法将运行时类绑定到 XAML T 必须是 WinRT 类型
- std::bind on statd::array 的运算符 []
- 您将如何连接"on the fly"文本+整数并将其传递给函数?
- 如何修复输出日志中的"EnableInput can only be specified on a Pawn for its Controller"错误
- 是否可以从控制台应用程序使用 C++/WinRT 创建窗口?
- VS2019 - Sudo Remote Debugging on Linux with Cmake project
- WinRT 应用调用 win32 c++ dll 发送参数
- C++ library with Tensorflow on Android
- SFML 交叉编译 for Windows on Linux.
- C++, C# and JavaScript on WinRT
- UuidToString on WinRT