| | Copyright |
| | Dedication |
| | Preface |
| | | Who This Book Is For |
| | | What You Need to Use This Book |
| | | Platform Notes |
| | | How This Book Is Organized |
| | | What Was Left Out |
| | | Conventions Used in This Book |
| | | About the Code |
| | | Using Code Examples |
| | | Comments and Questions |
| | | Safari Enabled |
| | | Acknowledgments |
| | Chapter 1. Numbers and Enumerations |
| | | Introduction |
| | | Recipe 1.1. Determining Approximate Equality Between a Fraction and Floating-Point Value |
| | | Recipe 1.2. Converting Degrees to Radians |
| | | Recipe 1.3. Converting Radians to Degrees |
| | | Recipe 1.4. Using the Bitwise Complement Operator with Various Data Types |
| | | Recipe 1.5. Testing for an Even or Odd Value |
| | | Recipe 1.6. Obtaining the High Word or Low Word of a Number |
| | | Recipe 1.7. Converting a Number in Another Base to Base10 |
| | | Recipe 1.8. Determining Whether a String Is a Valid Number |
| | | Recipe 1.9. Rounding a Floating-Point Value |
| | | Recipe 1.10. Choosing a Rounding Algorithm |
| | | Recipe 1.11. Converting Celsius to Fahrenheit |
| | | Recipe 1.12. Converting Fahrenheit to Celsius |
| | | Recipe 1.13. Safely Performing a Narrowing Numeric Cast |
| | | Recipe 1.14. Finding the Length of Any Three Sides of a Right Triangle |
| | | Recipe 1.15. Finding the Angles of a Right Triangle |
| | | Recipe 1.16. Displaying an Enumeration Value as a String |
| | | Recipe 1.17. Converting Plain Text to an Equivalent Enumeration Value |
| | | Recipe 1.18. Testing for a Valid Enumeration Value |
| | | Recipe 1.19. Testing for a Valid Enumeration of Flags |
| | | Recipe 1.20. Using Enumerated Members in a Bit Mask |
| | | Recipe 1.21. Determining if One or More Enumeration Flags Are Set |
| | | Recipe 1.22. Determining the Integral Part of a Decimal or Double |
| | Chapter 2. Strings and Characters |
| | | Introduction |
| | | Recipe 2.1. Determining the Kind of Character a char Contains |
| | | Recipe 2.2. Determining Whether a Character Is Within a Specified Range |
| | | Recipe 2.3. Controlling Case Sensitivity When Comparing Two Characters |
| | | Recipe 2.4. Finding All Occurrences of a Character Within a String |
| | | Recipe 2.5. Finding the Location of All Occurrences of a String Within Another String |
| | | Recipe 2.6. Implementing a Poor Man's Tokenizer to Deconstruct a String |
| | | Recipe 2.7. Controlling Case Sensitivity When Comparing Two Strings |
| | | Recipe 2.8. Comparing a String to the Beginning or End of a Second String |
| | | Recipe 2.9. Inserting Text into a String |
| | | Recipe 2.10. Removing or Replacing Characters Within a String |
| | | Recipe 2.11. Encoding Binary Data as Base64 |
| | | Recipe 2.12. Decoding a Base64-Encoded Binary |
| | | Recipe 2.13. Converting a String Returned as a Byte[ ] Back into a String |
| | | Recipe 2.14. Passing a String to a Method That Accepts only a Byte[ ] |
| | | Recipe 2.15. Converting Strings to Other Types |
| | | Recipe 2.16. Formatting Data in Strings |
| | | Recipe 2.17. Creating a Delimited String |
| | | Recipe 2.18. Extracting Items from a Delimited String |
| | | Recipe 2.19. Setting the Maximum Number of Characters a StringBuilder Can Contain |
| | | Recipe 2.20. Iterating over Each Character in a String |
| | | Recipe 2.21. Improving String Comparison Performance |
| | | Recipe 2.22. Improving StringBuilder Performance |
| | | Recipe 2.23. Pruning Characters from the Head and/or Tail of a String |
| | | Recipe 2.24. Testing a String for Null or Empty |
| | | Recipe 2.25. Appending a Line |
| | | Recipe 2.26. Encoding Chunks of Data |
| | Chapter 3. Classes and Structures |
| | | Introduction |
| | | Recipe 3.1. Creating Union-Type Structures |
| | | Recipe 3.2. Allowing a Type to Represent Itself as a String |
| | | Recipe 3.3. Converting a String Representation of an Object into an Actual Object |
| | | Recipe 3.4. Implementing Polymorphism with Abstract Base Classes |
| | | Recipe 3.5. Making a Type Sortable |
| | | Recipe 3.6. Making a Type Searchable |
| | | Recipe 3.7. Indirectly Overloading the +=, -=, /=, and *= Operators |
| | | Recipe 3.8. Indirectly Overloading the &&, ||, and ?: Operators |
| | | Recipe 3.9. Turning Bits On or Off |
| | | Recipe 3.10. Making Error-Free Expressions |
| | | Recipe 3.11. Minimizing (Reducing) Your Boolean Logic |
| | | Recipe 3.12. Converting Between Simple Types in a Language-Agnostic Manner |
| | | Recipe 3.13. Determining When to Use the Cast Operator, the as Operator, or the is Operator |
| | | Recipe 3.14. Casting with the as Operator |
| | | Recipe 3.15. Determining a Variable's Type with the is Operator |
| | | Recipe 3.16. Implementing Polymorphism with Interfaces |
| | | Recipe 3.17. Calling the Same Method on Multiple Object Types |
| | | Recipe 3.18. Adding a Notification Callback Using an Interface |
| | | Recipe 3.19. Using Multiple Entry Points to Version an Application |
| | | Recipe 3.20. Preventing the Creation of an Only Partially Initialized Object |
| | | Recipe 3.21. Returning Multiple Items from a Method |
| | | Recipe 3.22. Parsing Command-Line Parameters |
| | | Recipe 3.23. Retrofitting a Class to Interoperate with COM |
| | | Recipe 3.24. Initializing a Constant Field at Runtime |
| | | Recipe 3.25. Writing Code That Is Compatible with the Widest Range of Managed Languages |
| | | Recipe 3.26. Building Cloneable Classes |
| | | Recipe 3.27. Assuring an Object's Disposal |
| | | Recipe 3.28. Releasing a COM Object Through Managed Code |
| | | Recipe 3.29. Creating an Object Cache |
| | | Recipe 3.30. Rolling Back Object Changes |
| | | Recipe 3.31. Disposing of Unmanaged Resources |
| | | Recipe 3.32. Determining Where Boxing and Unboxing Occur |
| | Chapter 4. Generics |
| | | Introduction |
| | | Recipe 4.1. Deciding When and Where to Use Generics |
| | | Recipe 4.2. Understanding Generic Types |
| | | Recipe 4.3. Getting the Type of a Generic Type |
| | | Recipe 4.4. Replacing the ArrayList with Its Generic Counterpart |
| | | Recipe 4.5. Replacing the Stack and Queue with Their Generic Counterparts |
| | | Recipe 4.6. Implementing a Linked List |
| | | Recipe 4.7. Creating a Value Type That Can Be Initialized to Null |
| | | Recipe 4.8. Reversing the Contents of a Sorted List |
| | | Recipe 4.9. Making Read-Only Collections the Generic Way |
| | | Recipe 4.10. Replacing the Hashtable with Its Generic Counterpart |
| | | Recipe 4.11. Using foreach with Generic Dictionary Types |
| | | Recipe 4.12. Constraining Type Arguments |
| | | Recipe 4.13. Initializing Generic Variables to Their Default Values |
| | Chapter 5. Collections |
| | | Introduction |
| | | Recipe 5.1. Swapping Two Elements in an Array |
| | | Recipe 5.2. Reversing an Array Quickly |
| | | Recipe 5.3. Reversing a Two-Dimensional Array |
| | | Recipe 5.4. Reversing a Jagged Array |
| | | Recipe 5.5. Writing a More Flexible StackTrace Class |
| | | Recipe 5.6. Determining the Number of Times an Item Appears in a List<T> |
| | | Recipe 5.7. Retrieving All Instances of a Specific Item in a List<T> |
| | | Recipe 5.8. Inserting and Removing Items from an Array |
| | | Recipe 5.9. Keeping Your List<T> Sorted |
| | | Recipe 5.10. Sorting a Dictionary's Keys and/or Values |
| | | Recipe 5.11. Creating a Dictionary with Max and Min Value Boundaries |
| | | Recipe 5.12. Displaying an Array's Data as a Delimited String |
| | | Recipe 5.13. Storing Snapshots of Lists in an Array |
| | | Recipe 5.14. Persisting a Collection Between Application Sessions |
| | | Recipe 5.15. Testing Every Element in an Array or List<T> |
| | | Recipe 5.16. Performing an Action on Each Element in an Array or List<T> |
| | | Recipe 5.17. Creating a Read-Only Array or List<T> |
| | Chapter 6. Iterators and Partial Types |
| | | Introduction |
| | | Recipe 6.1. Implementing Nested foreach Functionality in a Class |
| | | Recipe 6.2. Creating Custom Enumerators |
| | | Recipe 6.3. Creating an Iterator on a Generic Type |
| | | Recipe 6.4. Creating an Iterator on a Non-generic Type |
| | | Recipe 6.5. Creating Iterators That Accept Parameters |
| | | Recipe 6.6. Adding Multiple Iterators on a Single Type |
| | | Recipe 6.7. Implementing Iterators as Overloaded Operators |
| | | Recipe 6.8. Forcing an Iterator to Stop Iterating |
| | | Recipe 6.9. Dealing with Finally Blocks and Iterators |
| | | Recipe 6.10. Organizing Your Interface Implementations |
| | | Recipe 6.11. Generating Code That Is No Longer in Your Main Code Paths |
| | Chapter 7. Exception Handling |
| | | Introduction |
| | | Recipe 7.1. Verifying Critical Parameters |
| | | Recipe 7.2. Knowing When to Catch and Rethrow Exceptions |
| | | Recipe 7.3. Identifying Exceptions and Their Usage |
| | | Recipe 7.4. Handling Derived Exceptions Individually |
| | | Recipe 7.5. Assuring Exceptions Are Not Lost When Using Finally Blocks |
| | | Recipe 7.6. Handling Exceptions Thrown from Methods Invoked via Reflection |
| | | Recipe 7.7. Debugging Problems When Loading an Assembly |
| | | Recipe 7.8. Mapping Back and Forth Between Managed Exceptions and HRESULTs |
| | | Recipe 7.9. Handling User-Defined HRESULTs |
| | | Recipe 7.10. Preventing Unhandled Exceptions |
| | | Recipe 7.11. Getting Exception Information |
| | | Recipe 7.12. Getting to the Root of a Problem Quickly |
| | | Recipe 7.13. Creating a New Exception Type |
| | | Recipe 7.14. Obtaining a Stack Trace |
| | | Recipe 7.15. Breaking on a First-Chance Exception |
| | | Recipe 7.16. Preventing the Nefarious TypeInitializationException |
| | | Recipe 7.17. Handling Exceptions Thrown from an Asynchronous Delegate |
| | | Recipe 7.18. Giving Exceptions the Extra Info They Need with Exception.Data |
| | | Recipe 7.19. Looking at Exceptions in a New Way Using Visualizers |
| | | Recipe 7.20. Dealing with Unhandled Exceptions in WinForms Applications |
| | Chapter 8. Diagnostics |
| | | Introduction |
| | | Recipe 8.1. Controlling Tracing Output in Production Code |
| | | Recipe 8.2. Providing Fine-Grained Control over Debugging/Tracing Output |
| | | Recipe 8.3. Creating Your Own Custom Switch Class |
| | | Recipe 8.4. Compiling Blocks of Code Conditionally |
| | | Recipe 8.5. Determining Whether a Process Has Stopped Responding |
| | | Recipe 8.6. Using Event Logs in Your Application |
| | | Recipe 8.7. Changing the Maximum Size of a Custom Event Log |
| | | Recipe 8.8. Searching Event Log Entries |
| | | Recipe 8.9. Watching the Event Log for a Specific Entry |
| | | Recipe 8.10. Finding All Sources Belonging to a Specific Event Log |
| | | Recipe 8.11. Implementing a Simple Performance Counter |
| | | Recipe 8.12. Implementing Performance Counters That Require a Base Counter |
| | | Recipe 8.13. Enabling and Disabling Complex Tracing Code |
| | | Recipe 8.14. Capturing Standard Output for a Process |
| | | Recipe 8.15. Creating Custom Debugging Displays for Your Classes |
| | | Recipe 8.16. Determining Current appdomain Settings Information |
| | | Recipe 8.17. Boosting the Priority of a Process Programmatically |
| | | Recipe 8.18. Looking at Your Runtime Environment and Seeing What You Can Do About It |
| | Chapter 9. Delegates, Events, and Anonymous Methods |
| | | Introduction |
| | | Recipe 9.1. Controlling When and If a Delegate Fires Within a Multicast Delegate |
| | | Recipe 9.2. Obtaining Return Values from Each Delegate in a Multicast Delegate |
| | | Recipe 9.3. Handling Exceptions Individually for Each Delegate in a Multicast Delegate |
| | | Recipe 9.4. Converting Delegate Invocation from Synchronous to Asynchronous |
| | | Recipe 9.5. Wrapping Sealed Classes to Add Events |
| | | Recipe 9.6. Passing Specialized Parameters to and from an Event |
| | | Recipe 9.7. An Advanced Interface Search Mechanism |
| | | Recipe 9.8. An Advanced Member Search Mechanism |
| | | Recipe 9.9. Observing Additions and Modifications to a Hashtable |
| | | Recipe 9.10. Using the Windows Keyboard Hook |
| | | Recipe 9.11. Tracking and Responding to the Mouse |
| | | Recipe 9.12. Using Anonymous Methods |
| | | Recipe 9.13. Set up Event Handlers Without the Mess |
| | | Recipe 9.14. Using Different Parameter Modifiers in Anonymous Methods |
| | | Recipe 9.15. Using Closures in C# |
| | | Recipe 9.16. Performing Multiple Operations on a List Using Functors |
| | Chapter 10. Regular Expressions |
| | | Introduction |
| | | Recipe 10.1. Enumerating Matches |
| | | Recipe 10.2. Extracting Groups from a MatchCollection |
| | | Recipe 10.3. Verifying the Syntax of a Regular Expression |
| | | Recipe 10.4. Quickly Finding Only the Last Match in a String |
| | | Recipe 10.5. Replacing Characters or Words in a String |
| | | Recipe 10.6. Augmenting the Basic String Replacement Function |
| | | Recipe 10.7. Implementing a Better Tokenizer |
| | | Recipe 10.8. Compiling Regular Expressions |
| | | Recipe 10.9. Counting Lines of Text |
| | | Recipe 10.10. Returning the Entire Line in Which a Match Is Found |
| | | Recipe 10.11. Finding a Particular Occurrence of a Match |
| | | Recipe 10.12. Using Common Patterns |
| | | Recipe 10.13. Documenting Your Regular Expressions |
| | | Recipe 10.14. Using Built-in Regular Expressions to Parse ASP. NET Pages |
| | Chapter 11. Data Structures and Algorithms |
| | | Introduction |
| | | Recipe 11.1. Creating a Hash Code for a Data Type |
| | | Recipe 11.2. Creating a Priority Queue |
| | | Recipe 11.3. Creating a Double Queue |
| | | Recipe 11.4. Determining Where Characters or Strings Do Not Balance |
| | | Recipe 11.5. Creating a One-to-Many Map (MultiMap) |
| | | Recipe 11.6. Creating a Binary Tree |
| | | Recipe 11.7. Creating an n-ary Tree |
| | | Recipe 11.8. Creating a Set Object |
| | Chapter 12. Filesystem I/O |
| | | Introduction |
| | | Recipe 12.1. Creating, Copying, Moving, or Deleting a File |
| | | Recipe 12.2. Manipulating File Attributes |
| | | Recipe 12.3. Renaming a File |
| | | Recipe 12.4. Determining Whether a File Exists |
| | | Recipe 12.5. Choosing a Method of Opening a File or Stream for Reading and/or Writing |
| | | Recipe 12.6. Accessing Part of a File Randomly |
| | | Recipe 12.7. Outputting a Platform-Independent EOL Character |
| | | Recipe 12.8. Creating, Writing to, and Reading from a File |
| | | Recipe 12.9. Determining Whether a Directory Exists |
| | | Recipe 12.10. Creating, Copying, Moving, or Deleting a Directory |
| | | Recipe 12.11. Manipulating Directory Attributes |
| | | Recipe 12.12. Renaming a Directory |
| | | Recipe 12.13. Searching for Directories or Files Using Wildcards |
| | | Recipe 12.14. Obtaining the Directory Tree |
| | | Recipe 12.15. Parsing a Path |
| | | Recipe 12.16. Parsing Paths in Environment Variables |
| | | Recipe 12.17. Verifying a Path |
| | | Recipe 12.18. Using a Temporary File in Your Application |
| | | Recipe 12.19. Opening a File Stream with Just a File Handle |
| | | Recipe 12.20. Writing to Multiple Output Files at One Time |
| | | Recipe 12.21. Launching and Interacting with Console Utilities |
| | | Recipe 12.22. Locking Subsections of a File |
| | | Recipe 12.23. Watching the Filesystem for Specific Changes to One or More Files or Directories |
| | | Recipe 12.24. Waiting for an Action to Occur in the Filesystem |
| | | Recipe 12.25. Comparing Version Information of Two Executable Modules |
| | | Recipe 12.26. Querying Information for All Drives on a System |
| | | Recipe 12.27. Encrypting/Decrypting an Existing File |
| | | Recipe 12.28. Compressing and Decompressing Your Files |
| | Chapter 13. Reflection |
| | | Introduction |
| | | Recipe 13.1. Listing Referenced Assemblies |
| | | Recipe 13.2. Listing Exported Types |
| | | Recipe 13.3. Finding Overridden Methods |
| | | Recipe 13.4. Finding Members in an Assembly |
| | | Recipe 13.5. Finding Members Within an Interface |
| | | Recipe 13.6. Determining and Obtaining Nested Types Within an Assembly |
| | | Recipe 13.7. Displaying the Inheritance Hierarchy for a Type |
| | | Recipe 13.8. Finding the Subclasses of a Type |
| | | Recipe 13.9. Finding All Serializable Types Within an Assembly |
| | | Recipe 13.10. Filtering Output When Obtaining Members |
| | | Recipe 13.11. Dynamically Invoking Members |
| | | Recipe 13.12. Providing Guidance to Obfuscators |
| | | Recipe 13.13. Determining if a Type or Method Is Generic |
| | | Recipe 13.14. Reading Manifest Resources Programmatically |
| | | Recipe 13.15. Accessing Local Variable Information |
| | | Recipe 13.16. Creating a Generic Type |
| | Chapter 14. Web |
| | | Introduction |
| | | Recipe 14.1. Converting an IP Address to a Hostname |
| | | Recipe 14.2. Converting a Hostname to an IP Address |
| | | Recipe 14.3. Parsing a URI |
| | | Recipe 14.4. Forming and Validating an Absolute Uri |
| | | Recipe 14.5. Handling Web Server Errors |
| | | Recipe 14.6. Communicating with a Web Server |
| | | Recipe 14.7. Going Through a Proxy |
| | | Recipe 14.8. Obtaining the HTML from a URL |
| | | Recipe 14.9. Using the New Web Browser Control |
| | | Recipe 14.10. Tying Database Tables to the Cache |
| | | Recipe 14.11. Caching Data with Multiple Dependencies |
| | | Recipe 14.12. Prebuilding an ASP.NET Web Site Programmatically |
| | | Recipe 14.13. Escaping and Unescaping Data for the Web |
| | | Recipe 14.14. Using the UriBuilder Class |
| | | Recipe 14.15. Inspect and Change Your Web Application Configuration |
| | | Recipe 14.16. Working with HTML |
| | | Recipe 14.17. Using Cached Results When Working with HTTP for Faster Performance |
| | | Recipe 14.18. Checking out a Web Server's Custom Error Pages |
| | | Recipe 14.19. Determining the Application Mappings for ASP.NET Set Up on IIS |
| | Chapter 15. XML |
| | | Introduction |
| | | Recipe 15.1. Reading and Accessing XML Data in Document Order |
| | | Recipe 15.2. Reading XML on the Web |
| | | Recipe 15.3. Querying the Contents of an XML Document |
| | | Recipe 15.4. Validating XML |
| | | Recipe 15.5. Creating an XML Document Programmatically |
| | | Recipe 15.6. Detecting Changes to an XML Document |
| | | Recipe 15.7. Handling Invalid Characters in an XML String |
| | | Recipe 15.8. Transforming XML |
| | | Recipe 15.9. Tearing Apart an XML Document |
| | | Recipe 15.10. Putting Together an XML Document |
| | | Recipe 15.11. Validating Modified XML Documents Without Reloading |
| | | Recipe 15.12. Extending XSLT Transformations |
| | | Recipe 15.13. Getting Your Schema in Bulk from Existing XML Files |
| | | Recipe 15.14. Passing Parameters to XSLT Transformations |
| | Chapter 16. Networking |
| | | Introduction |
| | | Recipe 16.1. Writing a TCP Server |
| | | Recipe 16.2. Writing a TCP Client |
| | | Recipe 16.3. Simulating Form Execution |
| | | Recipe 16.4. Downloading Data from a Server |
| | | Recipe 16.5. Using Named Pipes to Communicate |
| | | Recipe 16.6. Pinging Programmatically |
| | | Recipe 16.7. Send SMTP Mail Using the SMTP Service |
| | | Recipe 16.8. Check out Your Network Connectivity |
| | | Recipe 16.9. Use Sockets to Scan the Ports on a Machine |
| | | Recipe 16.10. Use the Current Internet Connection Settings |
| | | Recipe 16.11. Download a File Using FTP |
| | Chapter 17. Security |
| | | Introduction |
| | | Recipe 17.1. Controlling Access to Types in a Local Assembly |
| | | Recipe 17.2. Encrypting/Decrypting a String |
| | | Recipe 17.3. Encrypting and Decrypting a File |
| | | Recipe 17.4. Cleaning up Cryptography Information |
| | | Recipe 17.5. Verifying that a String Remains Uncorrupted Following Transmission |
| | | Recipe 17.6. Wrapping a String Hash for Ease of Use |
| | | Recipe 17.7. A Better Random Number Generator |
| | | Recipe 17.8. Storing Data Securely |
| | | Recipe 17.9. Making a Security Assert Safe |
| | | Recipe 17.10. Preventing Malicious Modifications to an Assembly |
| | | Recipe 17.11. Verifying That an Assembly Has Been Granted Specific Permissions |
| | | Recipe 17.12. Minimizing the Attack Surface of an Assembly |
| | | Recipe 17.13. Obtaining Security/Audit Information |
| | | Recipe 17.14. Granting/Revoking Access to a File or Registry Key |
| | | Recipe 17.15. Protecting String Data with Secure Strings |
| | | Recipe 17.16. Securing Stream Data |
| | | Recipe 17.17. Encrypting web.config Information |
| | | Recipe 17.18. Obtaining the Full Reason a SecurityException Was Thrown |
| | | Recipe 17.19. Achieving Secure Unicode Encoding |
| | | Recipe 17.20. Obtaining a Safer File Handle |
| | Chapter 18. Threading and Synchronization |
| | | Introduction |
| | | Recipe 18.1. Creating Per-Thread Static Fields |
| | | Recipe 18.2. Providing Thread-Safe Access to Class Members |
| | | Recipe 18.3. Preventing Silent Thread Termination |
| | | Recipe 18.4. Polling an Asynchronous Delegate |
| | | Recipe 18.5. Timing out an Asynchronous Delegate |
| | | Recipe 18.6. Being Notified of the Completion of an Asynchronous Delegate |
| | | Recipe 18.7. Determining Whether a Request for a Pooled Thread Will Be Queued |
| | | Recipe 18.8. Configuring a Timer |
| | | Recipe 18.9. Storing Thread-Specific Data Privately |
| | | Recipe 18.10. Granting Multiple Access to Resources with a Semaphore |
| | | Recipe 18.11. Synchronizing Multiple Processes with the Mutex |
| | | Recipe 18.12. Using Events to Make Threads Cooperate |
| | | Recipe 18.13. Get the Naming Rights for Your Events |
| | | Recipe 18.14. Performing Atomic Operations Among Threads |
| | Chapter 19. Unsafe Code |
| | | Introduction |
| | | Recipe 19.1. Controlling Changes to Pointers Passed to Methods |
| | | Recipe 19.2. Comparing Pointers |
| | | Recipe 19.3. Navigating Arrays |
| | | Recipe 19.4. Manipulating a Pointer to a Fixed Array |
| | | Recipe 19.5. Returning a Pointer to a Particular Element in an Array |
| | | Recipe 19.6. Creating and Using an Array of Pointers |
| | | Recipe 19.7. Switching Unknown Pointer Types |
| | | Recipe 19.8. Converting a String to a char* |
| | | Recipe 19.9. Declaring a Fixed-Size Structure with an Embedded Array |
| | Chapter 20. Toolbox |
| | | Introduction |
| | | Recipe 20.1. Dealing with Operating System Shutdown, Power Management, or User Session Changes |
| | | Recipe 20.2. Controlling a Service |
| | | Recipe 20.3. List What Processes an Assembly Is Loaded In |
| | | Recipe 20.4. Using Message Queues on a Local Workstation |
| | | Recipe 20.5. Finding the Path to the Current Framework Version |
| | | Recipe 20.6. Determining the Versions of an Assembly That Are Registered in the Global Assembly Cache (GAC) |
| | | Recipe 20.7. Getting the Windows Directory |
| | | Recipe 20.8. Capturing Output from the Standard Output Stream |
| | | Recipe 20.9. Running Code in Its Own appdomain |
| | | Recipe 20.10. Determining the Operating System and Service Pack Version of the Current Operating System |
| | About the Authors |
| | Colophon |
| | Index |