4.4 进阶阅读:关于动态语言运行时

DLR是Dynamic Language Runtime的简称,是构建于CLR之上的一系列类库,以提供对动态语言的支持。.NET CLR的核心价值之一就是支持多语言并允许它们之间互操作。动态语言在近些年已变得日益流行,因此人们希望使用自己喜欢的动态语言,并且在不失去卓越的.NET互操作性的前提下构建应用程序。DLR让这种想法成为现实。

DLR也支持.NET平台上现有的语言。它为静态类型的语言,例如C#,增加了动态的特性。使用C#4.0,可以很方便地支持动态对象,如COM Interop调用、HTML DOM或.NET反射。

动态语言可以在运行时识别一个对象的类型,然而,在静态类型语言中,例如C#,你必须在设计时就指定对象的类型。动态语言有很多,例如:JavaScript、PHP、Ruby、Python以及Groovy等。

在Visual Studio2010中,DLR为C#语言引入了新的dynamic对象,为它增加对动态特性的支持,从而允许与动态语言之间的互操作,DLR的架构如图4-15所示。

4.4 进阶阅读:关于动态语言运行时 - 图1

图 4-15 DLR架构图

从图4-6可看出,DLR使用联接器(Object Binder、JavaScript Binder、Python Binder等)来与除.NET框架之外的其他基本设施和服务进行通信,例如Silverlight、COM以及Python、Ruby等。联接器封装了语言的语义,并详细说明了在调用点(Call Site)中如何通过使用表达式树(Expression Tree)来执行操作。这让动态语言和使用DLR的静态语言得以共享类库,并可以访问所有DLR支持的技术。

DLR还帮助建立类库以支持动态操作。例如,如果有一个使用XML或者JavaScript Object Notation(JSON)对象的库,那么对于使用DLR的语言来说就是一些动态对象,这可以让类库的用户以更简单、更自然的方式来和这些对象进行交互。

例如,你可能使用如下C#语句来让一个位于XML文件中的计数器递增:


Scriptobj.SetProperty("Count",((int)GetProperty("Count"))+1);


如果使用DLR,那么下面的代码和上述代码是等价的:


scriptobj.Count+=1;


总结一下,DLR的目标就是简化如下操作:

❑移植动态语言到.NET平台;

❑为现有语言添加动态特性;

❑开发支持动态操作的类库;

❑在应用和框架中使用动态语言。

这里我们简单介绍了DLR,后面的章节会对它进行详细讲解,C#4.0的一个关键特性就是通过使用DLR引入的动态特性,这种特性使得语法进一步简化,代码更加直观和自然。因此,掌握和运用C#的动态特性很重要。