CHAPTER 18 UNDERSTANDING CIL AND THE ROLE OF DYNAMIC ASSEMBLIES
Source Code The RoundTrip example is included under the Chapter 18 subdirectory.
Understanding CIL Directives and Attributes
Now that you have seen how ildasm.exe and ilasm.exe can be used to perform a round-trip, you can get
down to the business of checking out the syntax and semantics of CIL itself. The next sections will walk
you through the process of authoring a custom namespace containing a set of types. However, to keep
things simple, these types will not contain any implementation logic for their members (yet). After you
understand how to create empty types, you can then turn your attention to the process of defining “real”
members using CIL opcodes.
Specifying Externally Referenced Assemblies in CIL
Create a new file named CILTypes.il using your editor of choice. The first task a CIL project will require
is to list the set of external assemblies used by the current assembly. For this example, you will only
make use of types found within mscorlib.dll. To do so, the .assembly directive will be qualified using
the external attribute. When you are referencing a strongly named assembly, such as mscorlib.dll,
you’ll want to specify the .publickeytoken and .ver directives as well, like so:
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 4:0:0:0
}
Note Strictly speaking, you are not required to explicitly reference mscorlib.dll as an external reference, as
ilasm.exe will do so automatically. However, for each external .NET library your CIL project requires, you will
need to author a similar .assembly extern directive.
Defining the Current Assembly in CIL
The next order of business is to define the assembly you are interested in building using the .assembly
directive. At the simplest level, an assembly can be defined by specifying the friendly name of the binary,
like so:
// Our assembly.
.assembly CILTypes { }
While this indeed defines a new .NET assembly, you will typically place additional directives within
the scope of the assembly declaration. For this example, update your assembly definition to include a
version number of 1.0.0.0 using the .ver directive (note that each numerical identifier is separated by
colons, not the C#-centric dot notation), as follows:
663