2010-07-21 9 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와 함께 제공되지 않았습니다. 새로운 DLR은 .NET에 포함되지 않은 기능에 대한

오래된 네임 스페이스는 또한 3.5 SP 1과 마찬가지로, DLR을 포함하지 않은 CLR의 버전이었다 4.

+0

안녕하세요. 링크를 가져 주셔서 감사합니다. 모든 동적 작업이 DLR에 어디로 파견 되는가? –

+0

페이지를 읽었습니까? 동적 언어 런타임 (DLR)은 .NET Framework 4의 새로운 API로, C#에서 동적 유형을 지원하는 인프라와 IronPython 및 IronRuby와 같은 동적 프로그래밍 언어의 구현을 제공합니다. " –

2

아니, DLR CodePlex의 소스는 아니다 무엇인가 .NET 4.0 프레임 워크에서. 어쨌든 직접은 아니야. System.Core.dll 어셈블리, System.Dynamic 네임 스페이스에 큰 조각이 다시 나타납니다. 이동 된 코드가 DLR 소스와 어느 정도 일치하는지는 게스트하기가 어렵습니다. 그것은 겉으로보기에는 똑같아 보이지만 확실한 칫솔질이 필요합니다. 4.0 소스 코드는 소스 코드 파일에서 diff를 쉽게 실행할 수있는 형식이 아닌 참조 소스에서 사용할 수 있습니다. ExpandoClass.cs의 spot-check은 4.0 버전에서 추가 된 (불필요한) 지시어와 거의 동일하다는 것을 보여줍니다. 이전에 DLR에서 수행 한 작업량을 감안할 때, 변경 사항은 상대적으로 미미한 수준으로 추정됩니다.

컴파일러에서 생성 된 호출과 DLR 사이에는 중간 계층이 있습니다. 먼저 Microsoft.CSharp.dll 어셈블리의 클래스 (C# 언어의 바인더)를 통과합니다. 바인더가 끝나고 DLR이 시작되는 곳은 리버스 엔지니어링이 매우 어렵습니다. 바인더 코드는 이 아니며 읽기가 쉽고 많은 작업을 수행합니다. System.Dynamic 네임 스페이스의 메서드 호출은 서로 얽혀 있습니다. 그리고 해당 소스 코드는 참조 소스에서 사용할 수 없습니다.

주어진 양의 바인더에 대한 질문에 대한 대답은 "DLR에 전달되는 동적 유형의 모든 작업입니까?"일 수 있습니다. 아니요, 아마도 아니요. 모두입니다.

+0

"DLR"을 "CodePlex에있는 것"으로 정의하는 것 같습니다. 그러나 그것은 사실이 아닙니다. .NET 4에 포함 된 DLR은 CodePlex의 미래 지향적 인 버전만큼 많은 "DLR"입니다. 그러나 어쨌든 귀하의 연구를 위해 +1. –

+0

.NET 4.0 프레임 워크의 내용은 Codeplex의 정확한 서브 세트, 모듈로 이름 공간 변경 사항 및 BCL이 고정되어 있다는 사실입니다. 중간에 공유 된 부분은 동일한 소스 트리에서 가져온 것입니다. –

2

"동적"으로 C#을 사용하는 경우 중요한 플레이어 중 하나는 C# 런타임 바인더입니다. 이 구성 요소는 DLR 인프라에 전적으로 의존하지만 DLR의 일부가 아닙니다. Microsoft.CSharp.dll 어셈블리에 있습니다.

+0

+1. 커트의 대답은 [권위있는 것으로 간주 될 수있다] (http://blogs.msdn.com/b/curth/). –

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로 이동합니다.

코드 플렉스의 DLR에는 분명히 자체 DLL (Microsoft.Scripting)이 필요했습니다.기본적으로 DLP는 IronPython 사용자가 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에서 찾을 수 있습니다.