关于 .net 和 winRT

About .net and winRT

我习惯在 .net 中编写代码,但我对 winRT 有点陌生,有几个问题:

  1. 当我使用 winRT 和 windows 商店应用程序的 .net 子集在 c# 中创建 Metro windows 商店应用程序时,这是托管应用程序吗? (由 clr 托管?)还是不受管理,.net 部分只是映射到 winRT。
  2. 当从非托管语言(如 c++)引用用 c# 编写的 windowsRT 组件时会发生什么?它使用 CLR 还是 100% 本机?

is this a managed application?

WinRT 应用作为进程外 COM 服务器运行。您使用的大部分代码是非托管的,例如您在 XAML 中使用的任何代码都是用 C++ 编写的。但这是一个很难看到的实现细节,它已经被内置到 CLR 中的语言投影仔细包装。这使得所有 WinRT 互操作看起来都像托管 classes。与您可以添加对 COM 组件的引用的方式一样,它看起来也像托管代码。

出于所有实际目的,您可以将您的应用称为托管应用,并且您将使用托管调试器来修复错误。

It makes use of the CLR or is it 100% native?

原生 C++ 是 100% 原生的。如果您在 C# 中编写 WinRT 组件并在 C++ 或 Javascript 应用程序中使用,则相同的场景相反,这些应用程序不知道您是在 C# 中编写代码的。它下面是 COM,这是 Microsoft 用来允许不同语言相互交谈的通用粘合剂。 CLR 负责互操作,就像您为 Office 应用程序编写加载项或使用 Microsoft.Office.Interop.Excel 自动化 Excel.

一样

请注意 .winmd 文件是弥合差距的关键,它完全等同于 COM 类型库或 .NET 元数据,以独立于语言的方式告诉编译器接口的外观。在编写自己的 WinRT 组件时的一些限制中也可见,您的 class 需要 密封 因为 COM 不支持实现继承。并且不能通用。您可以公开 DateTimeOffset 但不能公开 DateTime 等。