.NET solves "DLL hell" by creating a new kind of thing, referred to as an assembly . The big difference between an assembly and previous kinds of applications is that assemblies combine metadata with the portable executable. Metadata contains extra information that conveys meaning about the assembly, including things like strong names and version information. As a result .NET does not have to go to the registry to discern one .NET assembly from another, even if both assemblies have the same name .
Chapter 5 demonstrated how attributes can be applied to add metadata to an assembly and how to create custom attributes. Attributes are read using a new technology referred to as Reflection. In this chapter you also got a taste of an advanced use of Reflection by exploring examples of emitter and code generator programs. Attributes and Reflection are just two powerful reasons (among a list of many) to switch to .NET.