The Obsolete Attribute in Action. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
C# Attribute Shorthand Notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Building Custom Attributes .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Applying Custom Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
Restricting Attribute Usage.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Assembly-Level (and Module-Level) Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . 415
The Visual Studio 2005 AssemblyInfo.cs File . . . . . . . . . . . . . . . . . . . . . . . 415
Reflecting on Attributes Using Early Binding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
Reflecting on Attributes Using Late Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Putting Reflection, Late Binding, and Custom Attributes in Perspective . . . . . . 418
Building an Extendable Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
Building CommonSnappableTypes.dll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
Building the C# Snap-In . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
Building the Visual Basic .NET Snap-In . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
Building an Extendable Windows Forms Application . . . . . . . . . . . . . . . . . 421
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
■CHAPTER 13 Processes, AppDomains, Contexts, and CLR Hosts . . . . . . . . 425
Reviewing Traditional Win32 Processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
An Overview of Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Interacting with Processes Under the .NET Platform . . . . . . . . . . . . . . . . . . . . . . 427
Enumera
ting Running Processes
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
Investigating a Specific Process. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Investigating a Process’s Thread Set. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Investigating a Process’s Module Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Starting and Stopping Processes Programmatically . . . . . . . . . . . . . . . . . 434
Understanding .NET Application Domains. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Enumerating a Process’s AppDomains . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
Programmatically Creating New AppDomains . . . . . . . . . . . . . . . . . . . . . . 437
Programmatically Unloading AppDomains . . . . . . . . . . . . . . . . . . . . . . . . . 439
Understanding Object Context Boundaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Context-Agile and Context-Bound Types. . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Defining a Context-Bound Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
Inspecting an Object’s Context. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
Summarizing Processes, AppDomains, and Context . . . . . . . . . . . . . . . . . . . . . . 444
Hosting the Common Langua
ge Runtime
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
444
Side-by-Side Execution of the CLR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Loading a Specific
V
ersion of the CLR
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
446
Additional CLR Hosts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
■CONTENTSxviii
8237FM.qxd 12/29/06 10:09 AM Page xviii