我不太理解这张图。在 Metro 风格的应用程序中,C/C++ 是什么意思?原生 C/C++?还是托管 C++?他们(Metro 风格的应用程序)甚至没有 Win32 层!
要制作一个同时兼容 Metro 风格和桌面风格的应用程序,我们应该只使用 .NET 代码吗?老的原生应用能在Windows8平板上运行吗?
我不太理解这张图。在 Metro 风格的应用程序中,C/C++ 是什么意思?原生 C/C++?还是托管 C++?他们(Metro 风格的应用程序)甚至没有 Win32 层!
要制作一个同时兼容 Metro 风格和桌面风格的应用程序,我们应该只使用 .NET 代码吗?老的原生应用能在Windows8平板上运行吗?
是的,旧应用程序,包括使用 C/C++/Win32 编写的非托管本机应用程序和 .NET 中的托管应用程序,都可以在 Windows 8 平板电脑上正常运行。当然,除非平板电脑运行的是 ARM 处理器;那么它将仅支持新的 Metro 风格应用程序(以及专门针对 ARM 的应用程序)。
在图片中,C/C++ 表示位于 WinRT API 上的非托管本机应用程序,它也是非托管本机。对于那些想要使用 C# 或 VB.NET 的人来说,将与 .NET 无缝集成。
关于你的最后一个问题,你不能制作一个与 Metro 风格和桌面兼容的应用程序......它们是互斥的 - 你必须做出选择。
WinRT 是本机代码,而 C/C++ 是本机代码,尽管它们与 WinRT 一起使用时的语法看起来像 C++/CLI。据我所知,它似乎是为 C++ 而不是 C 设计的 API,所以它非常面向对象,人们似乎很兴奋。
C# 将使用 COM Interop 的常用方式来使用 WinRT。
引用本次讨论中的 Andy Rich (MSFT) 的话:
核心 WinRT 不受管理 - 它是原生的和基于 COM 的。我们的语言以高级语法提供了一个完全原生的投影,但您不受该语法的约束 - 您将能够使用低级 COM 或 WRL(类似 ATL 的模板库)来定位 Windows 运行时) 也是如此。(C#/VB 投影是另一回事,它们生成运行时可调用的包装对象,这些对象在 .NET 和 WinRT 之间编组。)
Metro 应用程序中的 C++ 是本机 C++。建议您使用新的语言扩展,它看起来很像 C++/CLI,并提供类似的高级体验 - 例如无需手动处理引用计数对象和字符串,或实现和调用QueryInterface
- 但在纯本机代码。不过,您不必这样做。
无论如何,对于您自己的类,您可以在 vanilla C++ 中定义它们,并将它们编译到库中。这样,您可以在应用程序的桌面版本(使用 MFC、Win32、Qt 或其他方式实现 UI)和 Metro 版本(使用 WinRT API 实现 UI)之间共享逻辑。同样,对于 .NET 应用程序,您可以将逻辑分离到在桌面和 Metro 之间重用的类库中。
没有办法编写一个应用程序,它可以在具有相同 UI 层的两者上运行,无论是在 C++ 中还是在 .NET 中。另一方面,如果您避免使用 WinRT API 并坚持 HTML5 标准,您可以在某种程度上使用 HTML/JS 进行近似 - 然后您可以通过将其托管在浏览器中来制作“桌面版本”。
我是一名专业的软件开发人员,虽然我主要编写基于 Web 的企业应用程序,但我也使用过 Visual Studio 2012 和 Windows 8。以下是我的发现:
由于 Metro 现在是一个禁止使用的术语,因此我将使用术语“平板电脑应用程序”来指代全屏应用程序,而使用“桌面应用程序”来指代在 Windows 桌面上运行的程序。
我不太理解这张图。在 Metro 风格的应用程序中,C/C++ 是什么意思?原生 C/C++?还是托管 C++?他们(Metro 风格的应用程序)甚至没有 Win32 层!
所有平板电脑应用程序都使用托管代码。这是因为 WinRT 操作系统无法运行 x86 或 AM64 指令。不过,这两个版本都可以很好地运行 .Net 代码。因此,所有 WinRT 应用程序都必须使用托管代码、使用 XAML UI,并且它们只能通过 Windows 应用商店分发。
要制作一个同时兼容 Metro 风格和桌面风格的应用程序,我们应该只使用 .NET 代码吗?
是的。这是完全正确的。您必须使用 .Net 代码。旧的本机应用程序无法在 Windows 8 平板电脑上运行。如果您像大多数通过实践学习的 Windows 开发人员一样,这将需要调整您编写代码的方式。
这是我的处理方式:
需要在不同外形尺寸(平板电脑、台式机、手机)上运行的基本程序将有 3 个类。模型和控制器类将在一个 DLL 中实现,以及一个定义 GUI 事件和方法的接口文件。唯一真正进入我的 .EXE 文件的是 GUI。GUI 中的唯一逻辑基本上是在用户在表单上执行需要程序执行某些操作的操作时引发事件。
例如,用户在文本字段中填写他的姓名,然后单击“提交”。这将引发一个 Submitted 事件,并将 Name 框中的值作为参数。控制器可以使用方法将反馈发送回表单,例如 UpdateStatus()
这听起来很复杂,而且需要更多的前期设计。这个系统的美妙之处在于,一旦你为一种形式实现了程序,你所要做的就是为其他形式修改你的 XAML。您的控制器和模型根本不会改变。(我相信有人会指出如何使用 XAML 模板来做到这一点,但我还没有。)
与 Windows 7 一样,64 位 Windows 不支持旧的 16 位应用程序。除此之外,是的,支持本机应用程序。