C H A P T E R 18
Understanding CIL and the Role of
Dynamic Assemblies
When you are building a full-scale .NET application, you will most certainly make use of C# (or a similar
managed language such as Visual Basic), given their inherent productivity and ease of use. However, as
you learned in the very first chapter, the role of a managed compiler is to translate *.cs code files into
terms of CIL code, type metadata, and an assembly manifest. As it turns out, CIL is a full-fledged .NET
programming language, with its own syntax, semantics, and compiler (ilasm.exe).
In this chapter, you will be given a tour of .NET’s mother tongue. Here you will understand the
distinction between a CIL directive, CIL attribute, and CIL opcode. You will then learn about the role of
round-trip engineering of a .NET assembly and various CIL programming tools. The remainder of the
chapter will then walk you through the basics of defining namespaces, types, and members using the
grammar of CIL. We’ll wrap up with an examination of the role of the System.Reflection.Emit
namespace and examine how it is possible to construct an assembly (with CIL instructions) dynamically
at runtime.
Of course, few programmers will ever need to work with raw CIL code on a day-to-day basis.
Therefore, I will start up this chapter by examining a few reasons why getting to know the syntax and
semantics of this low-level .NET language might be worth your while.
Reasons for Learning the Grammar of CIL
CIL is the true mother tongue of the .NET platform. When you build a .NET assembly using your
managed language of choice (C#, VB, F#, COBOL.NET, etc.), the associated compiler translates your
source code into terms of CIL. Like any programming language, CIL provides numerous structural and
implementation-centric tokens. Given that CIL is just another .NET programming language, it should
come as no surprise that it is possible to build your .NET assemblies directly using CIL and the CIL
compiler (ilasm.exe) that ships with the .NET Framework 4.5 SDK.
Now while it is true that few programmers would choose to build an entire .NET application directly
with CIL, CIL is still an extremely interesting intellectual pursuit. Simply put, the more you understand the
grammar of CIL, the better able you are to move into the realm of advanced .NET development. By way
of some concrete examples, individuals who possess an understanding of CIL are capable of the following:
•
Talking intelligently about how different .NET programming languages map their
respective keyword