Configuring Shared Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Freezing the Current Shared Assembly . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Building Shared Assembly Version 2.0.0.0. . . . . . . . . . . . . . . . . . . . . . . . 379
Dynamically Redirecting to Specific Versions of
a Shared Assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Revisiting the .NET Framework 2.0 Configuration Utility . . . . . . . . . . . . . 382
Investigating the Internal Composition of the GAC . . . . . . . . . . . . . . . . . . . . . . 382
Understanding Publisher Policy Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
Disabling Publisher Policy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Understanding the <codeBase> Element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
The System.Configuration Namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
The Machine Configuration File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
The Assembly Binding “Big Picture” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
■CHAPTER 12 Type Reflection, Late Binding, and Attribute-Based
Programming
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
The Necessity of Type Metadata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
Viewing (Partial) Metadata for the EngineState Enumeration . . . . . . . . . 392
Viewing (Partial) Metadata for the Car Type . . . . . . . . . . . . . . . . . . . . . . . 393
Examining a TypeRef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Documenting the Defining Assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Documenting Referenced Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Documenting String Literals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Understanding Reflection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
The System.Type Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Obtaining a Type Reference Using System.Object.GetType(). . . . . . . . . . 397
Obtaining a Type Reference Using System.Type.GetType() . . . . . . . . . . . 397
Obtaining a Type Reference Using typeof() . . . . . . . . . . . . . . . . . . . . . . . 398
Building a Custom Metadata Viewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
Reflecting on Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
Reflecting on Fields and Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
Reflecting on Implemented Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
Displaying Various Odds and Ends. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
Implementing Main(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
Reflecting on Method Parameters and Return Values . . . . . . . . . . . . . . . 401
Dynamically Loading Assemblies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Reflecting on Shared Assemblies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Understanding Late Binding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
The System.Activator Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Invoking Methods with No Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Invoking Methods with Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
■CONTENTS
xvii
4193FM.qxd 8/14/05 2:41 PM Page xvii