Несколько вопросов о DLR

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

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

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

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


person Water Cooler v2    schedule 21.07.2010    source источник


Ответы (4)


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

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

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

person Craig Stuntz    schedule 21.07.2010
comment
Привет. Спасибо за ссылку. Где сказано, что все динамические операции отправляются в DLR? - person Water Cooler v2; 21.07.2010
comment
Вы читали страницу? Это ясно как день: среда выполнения динамического языка (DLR) — это новый API в .NET Framework 4. Он предоставляет инфраструктуру, поддерживающую динамический тип в C#, а также реализацию языков динамического программирования, таких как IronPython и IronRuby. - person Craig Stuntz; 21.07.2010

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

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

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

person Hans Passant    schedule 21.07.2010
comment
Кажется, вы определяете DLR как то, что есть в CodePlex. Но это не так; DLR, поставляемый в .NET 4, является такой же DLR, как и перспективная версия в CodePlex. Но +1 в любом случае за ваше исследование. - person Craig Stuntz; 21.07.2010
comment
То, что есть в .NET 4.0 framework, является точным подмножеством того, что есть в Codeplex, с учетом изменения пространства имен по модулю и того факта, что BCL заморожен. Между тем, общие фрагменты взяты из одного и того же исходного дерева. - person Curt Hagenlocher; 22.07.2010

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

person Curt Hagenlocher    schedule 22.07.2010
comment
+1. Ответ Курта можно считать авторитетным. - person Craig Stuntz; 22.07.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 на codeplex, очевидно, нуждался в собственной 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.

person Alexandra Rusina    schedule 23.07.2010