Silverlight 2 包含对 Windows Presentation Foundation (WPF) UI 框架所做的大量 更改:新控件、丰富的网络 API 和数字版权管理 (DRM) 支持。Silverlight 2 中的一项主要更改就是能 够使用与 Microsoft .NET 兼容的语言编写 Web 客户端。在本文中,我将重点介绍 Silverlight 的开发核心:CoreCLR。
在过去的十几年中,我们已经拥有了许多不同的 Web 编程技术,从 CSS 到 ECMAScript 变体。其中 大部分技术都特定于 Web 编程任务,举例来说,通过编程 CSS 所学到的技术并不适用于其他领域。相比 之下,Silverlight 2 允许您使用适用于桌面编程的相同 .NET Framework 技术(如基类库、XAML 和 C# ),还允许您将这些技术直接应用到 Web 客户端应用程序。此外,也无需创建单独的 CoreCLR 开发环境 :您可以直接使用 Visual Studio 来设计、开发、调试和配置 C# 或 Visual Basic,就像使 用桌面应用程序一样。我们创建的 Silverlight 2 CoreCLR 可使 Web 编程像桌面编程一样丰富。
虽然拥有一个丰富的编程环境对开发人员很有好处,但用户并不想下载大型的浏览器插件。为了 使 Silverlight 适合用户使用,必须实现快速安装。我们已将 Beta 1 的安装大小缩减到 4.3MB,通过 宽带连接大约需要 6 到 10 秒钟即可安装。想想 .NET Framework 2.0 CLR 的两个主要核心部件 (mscorwks.dll 和 mscorlib.dll)的大小大约都等于 Silverlight 2 coreclr.dll 和 mscorlib.dll 相加的大小,这真是很了不起的成就。
深入了解 CoreCLR 引擎
自 2005 年 10 月发行 CLR 的 2.0 版本后即开始了 CoreCLR 的设计。它的两个主要设计目标是大小和兼容性:从编程人员的角 度来看,针对 CLR 的编码应该始终相同,而从用户的角度来看,下载必须非常小。由于 Silverlight 旨 在提供一组不同于桌面 CLR 的方案,因此,我们可以进行一些更改,以简化 CoreCLR 并允许我们缩减 Silverlight 的安装大小。但是,堆栈底部的一致性至关重要。行为差异(即使这些行为差异都正确)表 明堆栈上部有错误。
为了确保兼容性,我们在堆栈底部的各个组件中使用相同的代码。执行引擎 和虚拟机都是相同的。其中包括类型系统和元数据、垃圾回收器 (GC)、JIT 编译器、线程池以及运行时 引擎的其他核心部件。
但是,为了适应 Web 应用程序方案,进行了一些更改。例如,富 Internet 应用程序通常简单且运行时间短,JIT 编译器主要侧重于减少启动时间,而非执行更复杂的优 化操作。同样,服务器垃圾回收模式可以对使用相似分配模式的多个工作线程进行优化,而对 Web 托管 应用程序则行不通。因此,Silverlight 只包含针对交互式应用程序进行优化的标准工作站 GC。但是, 在 Silverlight 应用程序中使用 Microsoft 中间语言 (MSIL) 和元数据的方式与在针对桌面的托管应用 程序中的使用方式完全相同,而且应用程序的行为在用户的桌面上和在浏览器上一致。
事实上, Silverlight 并不打算取代桌面 CLR,这就引发了核心引擎中最大的变化:CoreCLR 将与桌面 CLR 进程 并行运行。过去,我们从来就不能在同一进程中运行 CLR 的两个版本。这是一个难题,原因有好几个, 其中一个是管理进程范围的状态:每个 CLR 实例都假定进程中只有一个 CLR,因而只有它可以处理其静 态数据。如果 CLR 1.1 和 2.0 中都包含 staticFoo 变量,而且在同一个进程中同时加载了这两个 CLR 版本,则任一版本都无法在不影响另一个 CLR 状态的情况下写入 staticFoo 变量。
虽然进程范 围的状态是最明显的问题,但在一个进程中并行运行两个 CLR 还会导致其他问题。例如,如果您同时运 行了两个 GC,如何防止其中一个 GC 挂起另一个 GC 的线程?此外,空间占用也存在问题:如果在一个 进程中加载多个 CLR,每个 CLR 都必须加载代码(这些代码可能都相同),并为其静态变量和托管堆留 出相应的空间。
在某些重要的情况下,托管 CoreCLR 需要与桌面运行时并行运行。如果 CoreCLR 和桌面 CLR 不能同时运行,我们将无法编写托管 Web 浏览器控件(该控件可以导航到使用 Silverlight 的网页)的桌面 Windows 窗体或 WPF 应用程序。若要解决这个潜在问题,只需在您的 Windows 计算机 上安装依赖于 CLR 的 Silverlight:每次安装 Windows XP SP2 和 Windows Vista 时,都会随操 作系统安装相当新的 CLR。但是,无论您的计算机上安装了哪种版本的 CLR(对于 Mac OS X 来说,即使 您的计算机上未安装任何 CLR),只要使所有 Silverlight 代码在 CoreCLR 上运行都必须确保绝对兼容 。因此,我们努力使 CoreCLR 可以与桌面 CLR 进程并行运行,我们相信经过我们的努力用户会获得更好 的 Silverlight 体验。