DLR Means dynamic language runtime
CLR Means Common language runtime
the CLR has an instruction called InvokeVirtual, which is used for calling a virtual method on a class or interface instance. When the classloader reads a .NET assembly, it verifies that the method targets for InvokeVirtual are all valid methods for the classes/interfaces where they’re used.
DLR includes a new opcode called InvokeDynamic, which supports method invocations on unknown on non-existent methods.
dynamic languages often allow classes to be dynamically redefined by program logic (which is disallowed by both the CLR and the JVM).
From the beginning, Microsoft’s .NET framework was designed to support a broad range of different programming languages on a Common Language Runtime (CLR). The CLR provides shared services to these languages ranging from a world-class GC and JIT to a sandboxed security model to tools integration for debugging and profiling. Sharing these features has two huge benefits for languages on the CLR.
The new Dynamic Language Runtime (DLR) adds a small set of key features to the CLR to make it dramatically better. It adds to the platform a set of services designed explicitly for the needs of dynamic languages. These include a shared dynamic type system, standard hosting model and support to make it easy to generate fast dynamic code. With these additional features it becomes dramatically easier to build high-quality dynamic language implementations on .NET.