|
|
|
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
|