Несколько вопросов о DLR - PullRequest
3 голосов
/ 21 июля 2010

Правда ли, что все операции с динамическим типом отправляются в DLR? Из этого видео , похоже, но они не говорят его так много слов, и я просто хочу быть уверенным, что утверждение верно, поскольку я собирался написать его в каком-то сообщении.

Они также говорят, что DLR в настоящее время находится в System.Core.dll.

Я хочу знать, имеет ли DLR собственную сборку или пространство имен.

Я просматриваю источник DLR и похоже, что он находится в Microsoft.Scripting.dll, но я не уверен. DLR также поставлялся с .NET 3.5?

Ответы [ 4 ]

4 голосов
/ 21 июля 2010

Да, динамические операции выполняются DLR .

DLR не поставлялся с .NET 3.5.

Старое пространство имен предназначалось для версий CLR, которые не включали DLR, например 3.5 SP 1. Также для новых функций DLR, не включенных в .NET 4.

2 голосов
/ 22 июля 2010

Когда вы используете C # с «динамическим», одним из важных игроков является механизм выполнения C #. Этот компонент не является частью DLR, хотя его функциональность полностью зависит от инфраструктуры DLR. Он находится в сборке Microsoft.CSharp.dll.

2 голосов
/ 21 июля 2010

Нет, источник DLR Codeplex - это не то, что находится в .NET 4.0 framework. Во всяком случае, не напрямую. Я вижу большие фрагменты в сборке System.Core.dll, пространство имен System.Dynamic. В какой степени этот перемещенный код идентичен источнику DLR, трудно угадать. На первый взгляд это выглядит идентично, но для уверенности вам понадобится зубчатая гребенка. Исходный код 4.0 доступен из Reference Source, но не в формате, который облегчает запуск diff для файлов с исходным кодом. Выборочная проверка ExpandoClass.cs показывает, что они почти идентичны, только с добавленной (ненужной) директивой using в версии 4.0. Учитывая объем работы, проделанной над DLR ранее, я бы оценил изменения как относительно незначительные.

Обратите внимание, что между вызовами, сгенерированными компилятором и DLR, существует промежуточный уровень. Сначала он проходит через классы в сборке Microsoft.CSharp.dll, связующего для языка C #. Точно, где заканчивается это связующее и начинается DLR, очень трудно реконструировать. Код связующего не легко читается и выполняет много работы. Вызовы методов в пространстве имен System.Dynamic переплетаются. И его исходный код недоступен из справочного источника.

Учитывая количество кода в подшивке, мой ответ на ваш вопрос "все ли операции над динамическим типом, отправляемым в DLR" будет: нет, вероятно, не всех из них.

1 голос
/ 23 июля 2010

Я бы порекомендовал начать с MSDN: http://msdn.microsoft.com/en-us/library/dd233052.aspx

По сути, DLR существует в двух версиях: одна поставляется с .NET 4, другая - с открытым исходным кодом на codeplex.

DLR в .NET является частью System.Core.Однако для работы с DLR языкам и фреймворкам нужны свои собственные механизмы связывания.В случае C # это средство связывания времени выполнения C #, которое находится в Microsoft.CSharp.dll.Таким образом, все, что вы объявляете «динамическим» в C #, сначала обрабатывается механизмом связывания среды выполнения C #, а затем переходит в DLR.

DLR в кодплексе, очевидно, нуждался в собственной DLL (которая теперь называется Microsoft.Scripting).По сути, DLR начался, когда парни из IronPython поняли, что то, что они делали, может использоваться в большем количестве мест, чем просто IronPython.Поэтому они реорганизовали код и создали отдельный слой DLR.Этот слой DLR был позже включен в .NET, и именно здесь две версии разветвлены.

. Версия .NET фактически имеет меньше возможностей, чем версия с открытым исходным кодом.Итак, если вы хотите, скажем, разработать свой собственный динамический язык в .NET, используйте версию с открытым исходным кодом.Если какая-то команда MS решает поддерживать динамические функции (как это делали в Silverlight), им обычно приходится работать с той, которая есть в .NET Framework.

Если вы просто используете динамические функции C #, вы в основном ненужно вообще беспокоиться о DLR (единственная интересная вещь для вас может быть пространством имен System.Dynamic, которое предоставляет несколько хороших классов, таких как ExpandoObject и DynamicObject).Еще одно пространство имен, интенсивно используемое DLR (но не строго его частью), - это System.LINQ.Expressions, который используется для операций с деревьями выражений.В этом выпуске он был расширен для DLR, и его можно найти как в версии с открытым исходным кодом DLR, так и в .NET Framework.

...