2010-07-21 80 views
3

動態類型的所有操作是否都被調度到DLR?從this video看起來好像是,但他們並沒有用這麼多的話來說,我只是想確定這個說法是正確的,因爲我正要在一些溝通中寫下來。有關DLR的幾個問題

他們也說DLR目前在System.Core.dll中。

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

我在瀏覽DLR source,看起來它確實存在於Microsoft.Scripting.dll中,但我無法確定。 DLR是否也帶有.NET 3.5?

回答

4

是,dynamic operations are implemented by the DLR

DLR沒有提供.NET 3.5。

舊的命名空間是爲CLR版本其中不包括DLR,像3.5 SP 1,也爲新的DLR功能不是在.NET包括4

+0

嗨。感謝您的鏈接。它在哪裏說所有的動態操作都被派往DLR? – 2010-07-21 13:15:15

+0

您是否閱讀過該頁面?這一點顯而易見:「動態語言運行時(DLR)是.NET Framework 4中的一個新API。它提供了支持C#中的動態類型的基礎結構,以及動態編程語言(如IronPython和IronRuby)的實現。」 – 2010-07-21 13:24:21

2

沒有,DLR Codeplex上源是不是出了什麼在.NET 4.0框架中。不直接反正。我在System.Core.dll程序集System.Dynamic命名空間中看到了大量的它。移動代碼與DLR源相同的程度很難讓人感到厭惡。它看起來一模一樣,但你需要一個精細的齒梳來確保。 4.0源代碼可以從參考源獲得,只是沒有使得在源代碼文件上運行diff的格式變得容易。對ExpandoClass.cs進行抽查表明它們幾乎與4.0版本中添加的(不必要的)使用指令相同。考慮到之前在DLR上所做的工作量,我估計這些變化相對較小。

請注意,編譯器生成的調用和DLR之間存在中間層。它首先檢查Microsoft.CSharp.dll程序集中的類,這是C#語言的聯編程序。確切地說,結合處結束並且DLR開始的地方很難進行逆向工程。活頁夾代碼是而不是易於閱讀,並做了很多工作。調用System.Dynamic名稱空間中的方法是交織在一起的。它的源代碼不可從參考源獲得。

鑑於活頁夾中的代碼量,我對您的問題的回答是「對發送到DLR的動態類型的所有操作」將是:否,可能不是全部是

+0

您似乎將「DLR」定義爲「CodePlex中的內容」。但事實並非如此。在.NET 4中發佈的DLR與CodePlex中的前瞻版本一樣多「DLR」。但無論如何你的研究+1。 – 2010-07-21 14:40:51

+0

.NET 4.0框架中的內容是Codeplex上的內容,模數名稱空間更改以及BCL被凍結的確切子集。從內部來看,共享片段來自同一個源代碼樹。 – 2010-07-22 13:25:10

2

當你在C#中使用「動態」時,一個重要的角色是C#運行時綁定。這個組件不是DLR的一部分,儘管它的功能完全依賴於DLR基礎設施。它位於程序集Microsoft.CSharp.dll中。

+0

+1。 Curt的答案[可以被認爲是權威](http://blogs.msdn.com/b/curth/)。 – 2010-07-22 19:20:34

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)。基本上,DLR從IronPython傢伙意識到他們所做的可以在更多地方使用而不僅僅是IronPython時開始。所以他們重構了代碼並創建了一個單獨的DLR層。這個DLR層後來被合併到了.NET中,這就是兩個版本。

.NET版本實際上比開源版本的功能要少。所以,如果你想讓我們說在.NET上開發你自己的動態語言,請使用開源版本。如果某個MS團隊決定支持動態特性(如Silverlight那樣),他們通常必須使用.NET Framework中的動態特性。

如果您只是使用C#動態功能,您根本不需要擔心DLR(對您而言,唯一有趣的可能是提供一些很好的類(如ExpandoObject和DynamicObject)的System.Dynamic命名空間)。 DLR重用的另一個命名空間(但不是嚴格意義上的一部分)是System.LINQ.Expressions,用於表達式樹的操作。它在本發行版中爲DLR進行了擴展,您可以在DLR開放源代碼版本和.NET Framework中找到它。