3

动态类型上的所有操作都被分派给 DLR 是真的吗?从这个视频来看,看起来但他们并没有说太多话,我只是想确保这个声明是正确的,因为我正要在一些交流中写下它。

他们还说 DLR 当前位于 System.Core.dll 中。

我想知道 DLR 是否有自己的程序集或命名空间。

我正在浏览DLR 源,看起来它确实存在于 Microsoft.Scripting.dll 中,但我不能确定。DLR 是否还附带 .NET 3.5?

4

4 回答 4

4

是的,动态操作由 DLR 实现

DLR 未随 .NET 3.5 一起提供。

旧命名空间适用于不包含 DLR 的 CLR 版本,例如 3.5 SP 1。也适用于 .NET 4 中未包含的新 DLR 功能。

于 2010-07-21T13:08:27.673 回答
2

不,DLR Codeplex 源不是 .NET 4.0 框架中的。反正不是直接的。我在 System.Core.dll 程序集 System.Dynamic 命名空间中看到了它的大部分内容。很难猜测移动代码与 DLR 源代码在何种程度上相同。粗略一看,它看起来一模一样,但你需要一把细齿梳子才能确定。4.0 源代码可从参考源获得,只是格式不便于在源代码文件上运行差异。对 ExpandoClass.cs 的抽查表明,它们与 4.0 版本中添加的(不必要的) using 指令几乎完全相同。鉴于之前在 DLR 上完成的工作量,我估计这些更改相对较小。

请注意,在编译器和 DLR 生成的调用之间有一个中间层。它首先遍历 Microsoft.CSharp.dll 程序集中的类,即 C# 语言的绑定器。很难对绑定器结束和 DLR 开始的确切位置进行逆向工程。活页夹代码不易阅读,工作量很大。对 System.Dynamic 命名空间中的方法的调用是相互交织的。并且它的源代码不能从参考源中获得。

鉴于活页夹中的代码量,我对您的问题“是否所有对动态类型的操作都分派到 DLR”的回答是:不,可能不是全部

于 2010-07-21T14:34:09.193 回答
2

当您将 C# 与“动态”一起使用时,一个重要的参与者是 C# 运行时绑定器。此组件不是 DLR 的一部分,但其功能完全取决于 DLR 基础架构。它位于程序集 Microsoft.CSharp.dll 中。

于 2010-07-22T13:29:38.103 回答
1

我建议从 MSDN 开始:http: //msdn.microsoft.com/en-us/library/dd233052.aspx

基本上,DLR 存在两个版本:一个附带 .NET 4,另一个是 codeplex 上的开源版本。

.NET 中的 DLR 是 System.Core 的一部分。但是,语言和框架需要自己的绑定器才能与 DLR 一起使用。对于 C#,这是 C# 运行时绑定程序,它位于 Microsoft.CSharp.dll 中。因此,无论您在 C# 中声明什么是“动态的”,都首先由 C# 运行时绑定程序处理,然后转到 DLR。

codeplex 上的 DLR 显然需要自己的 DLL(现在是 Microsoft.Scripting)。基本上,当 IronPython 的人意识到他们所做的事情可以在更多地方使用而不仅仅是 IronPython 时,DLR 就开始了。所以他们重构了代码并创建了一个单独的 DLR 层。这个 DLR 层后来被合并到 .NET 中,这就是两个版本的分叉。

.NET 版本实际上比开源版本具有更少的功能。因此,如果您想在 .NET 上开发自己的动态语言,请使用开源版本。如果某些 MS 团队决定支持动态功能(如 Silverlight 所做的),他们通常必须使用 .NET Framework 中的功能。

如果您只使用 C# 动态特性,您基本上根本不需要担心 DLR(您唯一感兴趣的可能是 System.Dynamic 命名空间,它提供了一些不错的类,例如 ExpandoObject 和 DynamicObject)。DLR 大量使用的另一个命名空间(但不是严格意义上的一部分)是 System.LINQ.Expressions,它用于表达式树的操作。它在此版本中针对 DLR 进行了扩展,您可以在 DLR 开源版本和 .NET Framework 中找到它。

于 2010-07-23T18:57:06.237 回答