MCTS Self-Paced Training Kit (Exam 70-536): Microsoft® .NET Framework 2.0-Application Development Foundation Comments and Corrections (923018)



The information in this article applies to:

  • MCTS Self-Paced Training Kit (Exam 70-536): Microsoft .NET Framework 2.0 - Application Development Foundation, ISBN 0-7356-2277-9

SUMMARY

This article contains comments, corrections, and information about known errors relating to the Microsoft Press book MCTS Self-Paced Training Kit (Exam 70-536): Microsoft® .NET Framework 2.0-Application Development Foundation, 0-7356-2277-9.

The following topics are covered:

  • CD-ROM: lesson3-exercise1-Person-partial code samples are missing from \Chapter01 folder
  • Page 3: System.Value referenced rather than System.ValueType
  • Page 12: Term "defines" used in place of "initializes" in step 4
  • Page 14: Term "class" used in place of term "structure" in step 5
  • Page 18: The word "variable" is missing from the final sentence
  • Page 24: C# code sample missing
  • Page 46: Correction in code example
  • Page 51: Methods incorrectly named
  • Page 55: Incorrect description of narrowing conversion behavior
  • Page 59: Decimal used in place of Double in code for Exercise 1
  • Page 72: "Exist property" referenced in place of "Exists property"
  • Page 74: DriveInfo class described incorrectly
  • Page 76: Unknown member description is missing the word "type"
  • Page 76: Procedure said to access rather than enumerate drives
  • Page 81: The term "Added" is used in place of "Created, Deleted"
  • Page 83: Drive referred to in place of folder
  • Page 83: The term "include" used in place of "using" in Step 2
  • Page 84: Incorrect direction in step 6
  • Page 85: EnableRaisingEvents property referred to as EnablingRaisingEvents
  • Page 91: Suggestion that files can be created when read
  • Page 92: Incorrect description of the functionality of the Directory class
  • Page 104: Incorrect description of the behavior of the sample code
  • Page 111: The term "include" used in place of "using" in Step 2
  • Page 111: Incorrect instruction in step 3 of Excercise 1
  • Page 112: Class referred to in place of object
  • Page 115: The descriptions of the CanRead property is incorrect
  • Page 120: CompressionMode.Compress used in place of CompressionMode.Decompress
  • Page 121: The term "include" used in place of "using" in Step 2
  • Page 122, Step 9: Additional note needs to be added.
  • Page 127: Term "file" used in place of "directory"
  • Page 129: Incorrect definition for IsolatedStorageFileStream
  • Page 133: Files referenced in place of directories
  • Page 135: The term "include" used in place of "using" in Step 2
  • Page 135: Object referenced in place of class
  • Page 135: Incorrect Visual Basic code in step 3
  • Page 136: Incorrect Visual Basic code in steps 4 and 5
  • Page 137: Sample code missing
  • Page 139: Clarification of data in 4th bullet down under Chapter Summary
  • Page 140: Incorrect description of Case Scenarios
  • Page 141: Machine-level data referred to as assembly data
  • Page 188: Class referenced in place of collection
  • Page 192: Missing newline in code sample
  • Page 200: Answer B to question 2 is imprecise
  • Page 204: Description of code sample is incorrect
  • Page 209: DictionaryEntry referred to as DictionaryEntries
  • Page 210: Brackets used incorrectly in VB code example
  • Page 213: Incorrect method used for supporting class
  • Page 213: Values property referred to as the Value property
  • Page 216: Incorrect description of Hashtable functionality
  • Page 228: Four bits referenced in place of three bits
  • Page 230: Bits referred to as bytes
  • Page 234: CollectionsUtil referred to as CollectionUtil
  • Page 235: CollectionsUtil referred to as CollectionUtil
  • Page 238: Incorrect usage of ListCollection class name in Step 3
  • Page 239: CollectionsUtil referred to as CollectionUtil
  • Page 246: KeyValuePair referred to as NameValuePair
  • Page 249: Class referred to as object
  • Page 250: Dictionary referred to as a Queue
  • Page 250: First line of VB code example incorrect
  • Page 254: KeyValuePair referred to as NameValuePair
  • Page 258: ReadOnlyCollectionBase class referred to as ReadOnlyCollection base
  • Page 259: The term "state abbreviations" used in place of "calling codes"
  • Page 263: Incorrect text in Case Scenario 1, question 2
  • Page 370: ThreadState.WaitJoinSleep referenced in place of ThreadState.WaitSleepJoin
  • Page 373: Thread referenced in place of value
  • Page 373: Correction in method name and output phrase
  • Page 377: ThreadStart delegate referenced as StartThread
  • Page 378: Missing line break in code sample
  • Page 380: Domain referenced in place of state
  • Page 383: Include statement referenced in place of using statement
  • Page 383: StartThread referenced in place of ThreadStart
  • Page 387: Interlock class referenced in place of Interlocked class
  • Page 389: Reading from memory referred to as reading into memory
  • Page 390: AddCount method referenced in place of UpdateCount method
  • Page 407: EventWaitHandles referenced in place of EventWaitHandle
  • Page 410: Interlock class referenced in place of Interlocked class
  • Page 414: Bytes written referenced in place of bytes read
  • Page 419: Event referenced in place of class
  • Page 421: QueueWorkItem referenced in place of QueueUserWorkItem
  • Page 421: Extra closing parenthesis included in code sample
  • Page 424: RegisterWaitHandle referenced in place of RegisterWaitForSingleObject
  • Page 429: Thread execution behavior misrepresented
  • Page 432: Case scenario topics misrepresented
  • Page 512: The first paragraph on the page is not correct
  • Pages 544-545: ConfigurationSection needs a custom constructor created
  • Page 546: Configuration class referenced in place of ConfigurationManager class
  • Page 549: Suggested practice heading correction
  • Page 556: Application referenced in place of "event log" in Figure 10-2 caption
  • Pages 564-565: The term methods is used in place of members
  • Page 567: Incorrect description of the Write method of the Debug class
  • Page 568: Incorrect description of the WriteLine method of the Debug class
  • Page 579: Incorrect reference to the previous version of the .NET Framework
  • Page 579: Method referenced in place of attribute
  • Page 582: DelimmedListTraceListener referenced in place of DelimitedListTraceListener
  • Page 582-583: Methods referenced in place of members
  • Page 584: Incorrect configuration file code
  • Page 590: MyListener not added to the Trace.Listeners collection
  • Page 600: The image in Figure 10-13 is incorrect
  • Page 601: The image in Figure 10-14 is incorrect
  • Page 606: this used in place of Me in code sample
  • Page 606: Incorrect variable declaration in second code sample
  • Page 606: tbFileName not used in Process.Start statement in the third code sample
  • Page 607: Incorrect Figure 10-15
  • Page 608: tbUsername used in place of tbUserName
  • Page 619: IP_Address used in place of IP_Enabled
  • Page 621: Incorrect using directives in step 5
  • Page 733: Managers group referenced in place of Accounting group
  • Page 790: .NET application referenced in place of COM application
  • Page 794: Square brackets used in place of angle brackets
  • Page 799-800: Unneeded using statements in C# code samples
  • Page 831: Models referenced in place of modules
  • Page 834: Code sample included in the wrong location
  • Page 838: Include statement referenced in place of using statement
  • Page 838: ShowAssembly method referenced in place of ShowAssemblyInfo
  • Page 847: GetCustomAttribute referenced in place of GetCustomAttributes
  • Page 852: Class referenced in place of instance
  • Pages 855-856: InterfaceInfo referenced in place of Type
  • Page 861: Enumeration referenced in place of property
  • Page 864: Include statement referenced in place of using statement
  • Pages 864-865: BindingFlag referenced in place of BindingFlags
  • Page 871: Class referenced in place of method
  • Page 871: Object referenced in place of class
  • Page 872: Include statement referenced in place of using statement
  • Page 876: EventBulder class referenced in place of EventBuilder class
  • Page 879: Class referenced in place of object
  • Page 881: PropertyAttribute referenced in place of PropertyAttributes
  • Page 882: Include statements referenced in place of using statements
  • Page 887: Incorrect scope given for case scenarios
  • Page 930: Error in C# in code sample
  • Page 936: Culture class listed incorrectly in first paragraph
  • Page 936: Culture class listed incorrectly in first NOTE section
  • Page 945: Clarification needed for answers B and D for question 2
  • Page 946: Creating items referenced rather than passing them
  • Page 953: Answer explanation incorrect
  • Page 954: Corrections in answers for Lesson 2
  • Page 977: Reference to question 3 should be removed
  • Page 977: .NET Framework 0 referenced in place of .NET Framework 2.0
  • Page 978: Mapping specification is required for OpenMappedMachineConfiguration
  • Page 986: SecurityAction.Demand can be used declaratively

MORE INFORMATION

CD-ROM: lesson3-exercise1-Person-partial code samples are missing from \Chapter01 folder

The Visual Basic and C# code samples "lesson3-exercise1-Person-partial" are missing from the \Code\Chapter01 folder. The folders and files are available for download from the Microsoft Download Center:

lesson3.exe

For additional information about how to download Microsoft Support files, click the following article number to view the article in the Microsoft Knowledge Base:

119591 How to Obtain Microsoft Support Files from Online Services

Microsoft scanned this file for viruses. Microsoft used the most current virus-detection software that was available on the date that the file was posted. The file is stored on security-enhanced servers that help to prevent any unauthorized changes to the file.

Page 3: System.Value referenced rather than System.ValueType

On page 3, the first sentence after the first bulleted list reads:

"Each of these types is derived from the System.Value base type."

It should read:

"Each of these types is derived from the System.ValueType base type."

Page 12: Term "defines" used in place of "initializes" in step 4

On page 12, the first sentence of step 4 reads:

"Create a constructor that defines all three member variables, as the following code demonstrates:"

It should read:

"Create a constructor that initializes all three member variables, as the following code demonstrates:"

Page 14: Term "class" used in place of term "structure" in step 5

On page 14, the first sentence of step 5 reads:

"Modify your Main code to properly construct an instance of the Person class, as the following code sample demonstrates:"

It should read:

"Modify your Main code to properly construct an instance of the Person structure, as the following code sample demonstrates:"

Page 18: The word "variable" is missing from the final sentence

On page 18, the last sentence on the page reads:

"When you modify a reference type, you modify all copies of that reference type."

It should read:

"When you modify a reference type variable, you modify all copies of that reference type variable."

Page 24: C# code sample missing

On page 24, the following code sample should be added directly below the VB code sample:

// C#

try 
{
    StreamReader sr = new StreamReader("text.txt");
    Console.WriteLine(sr.ReadToEnd);
} 

catch (System.IO.FileNotFoundException ex) 
{
    Console.WriteLine("The file could not be found.");
} 

catch (System.UnauthorizedAccessException ex)
{
    Console.WriteLine("You do not have sufficient permissions.");
}

catch (Exception ex) 
{
    Console.WriteLine("Error reading file: " + ex.Message);
}


Page 46: Incorrect use of MyEvent in code sample

On page 46, Chapter 1, Lesson 3 the C# code example under the third bullet point reads:

MyEventHandler handler = MyEvent;

It should read:

if (MyEvent != null)
 
    MyEvent(this, EventArgs.Empty);


Page 51: Methods incorrectly named

On page 51, in step 4 the code samples read:

'VB
Private Sub Form1_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) _'

and

//C#
private void Timer_Shown(object sender, EventArgs e)


They should read:

'VB
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _'

and

//C#
private void Form1_Load(object sender, EventArgs e)


Page 55: Incorrect description of narrowing conversion behavior

On page 55, the sentence at the bottom of the page reads:

"Narrowing conversions fail if the source value exceeds the destination type's range or if a conversion between the types is not defined, so you should enclose a narrowing conversion in Try blocks or use TryCast or TryParse and check the return value."

It should read:

"Narrowing conversions may return an incorrect result if the source value exceeds the destination type's range. If a conversion between the types is not defined you will receive a compile-time error."

Page 59: Decimal used in place of Double in code for Exercise 1

On page 59, in the third line of VB code in the second step of Exercise 1 reads:

Dim db As Decimal = 1

It should read:

Dim db As Double = 1


Page 72: "Exist property" referenced in place of "Exists property"

On page 72, the first sentence after the bulleted list reads:

"For example, you can check whether a file exists by calling the FileInfo object's Exist property, as shown in the following code:"

It should read:

"For example, you can check whether a file exists by calling the FileInfo object's Exists property, as shown in the following code:"

Page 74: DriveInfo class described incorrectly

On page 74, the first sentence under the DriveInfo class section reads:

"The DriveInfo class provides the basic functionality to access and manipulate a single directory in the file system."

It should read:

"The DriveInfo class models a drive and provides methods and properties to query for drive information. Use DriveInfo to determine what drives are available, and what type of drives they are. You can also query to determine the capacity and available free space on the drive."

Page 76: Unknown member description is missing the word "type"

On page 76, the description of the Unknown member in Table 2-9 reads:

"The drive could not be determined."

It should read:

"The drive type could not be determined."

Page 76: Procedure said to access rather than enumerate drives

On page 76, the first sentence of the How to Enumerate Drives section reads:

"You follow this procedure to access the drives in a system:"

It should read:

"You follow this procedure to enumerate all the drives in a system:"

Page 81: The term "Added" is used in place of "Created, Deleted"

On page 81, the first sentence of the second paragraph reads:

"In addition to using the Added and Changed events, you can monitor the system for renamed files."

It should read:

"In addition to using the Created, Deleted and Changed events, you can monitor the system for renamed files."

Page 83: Drive referred to in place of folder

On page 83, the first sentence of Excercise 1 reads:

"In this exercise, you will enumerate through all the files in a particular drive."

It should read:

"In this exercise, you will enumerate through all the files in a particular folder."

Page 83: The term "include" used in place of "using" in Step 2

On page 83, step 2 reads:

"Add an Import (or an include in C#) for the System.IO namespace into the new project."

It should read:

"Add an Import (or aa using statement in C#) for the System.IO namespace into the new project."

Page 84: Incorrect direction in step 6

On page 84, the first sentence of step 6 reads:

"In the Main method, write code to create a new instance of a DirectoryInfo object for the Windows directory and use it to call the new ShowDirectory method."

It should read:

"In the Main method, write code to create a new instance of a DirectoryInfo class for the System directory and use it to call the new ShowDirectory method."

Page 85: EnableRaisingEvents property referred to as EnablingRaisingEvents

On page 85, step 7 reads:

"Set the EnablingRaisingEvents property to true to tell the watcher object to start throwing events."

It should read:

"Set the EnableRaisingEvents property to true to tell the watcher object to start throwing events."

Page 91: Suggestion that files can be created when read

On page 91, the first bullet point reads:

"Operations to create or open files for reading"

It should read:

"Operations to open files for reading"

Page 92: Incorrect description of the functionality of the Directory class

On page 92, the second sentence of the Directory Class section reads:

"The Directory class provides the basic functionality to open file streams for reading and writing."

It should read:

"The Directory class provides the basic functionality to create, manage, delete, and analyze directories."

Page 104: Incorrect description of the behavior of the sample code

On page 104, the last sentence on the page reads:

"For example, the following code will read the code just shown:"

It should read:

"For example, the following code will read the data written by the code just shown:"

Page 111: The term "include" used in place of "using" in Step 2

On page 111, step 2 reads:

"Add an Import (or an include in C#) for the System.IO namespace into the new project."

It should read:

"Add an Import (or aa using statement in C#) for the System.IO namespace into the new project."

Page 111: Incorrect instruction in step 3 of Excercise 1

On page 111, step 3 of Exercise 1 reads:

"In the Main method, create a new StreamWriter from the Create method of the File class."

It should read:

"In the Main method, create a new StreamWriter by calling the CreateText method of the File class."

Page 112: Class referred to in place of object

On page 112, step 2 of Exercise 2 reads:

"In the Main method after the StreamWriter class is closed, open the file using the OpenText method of the File class to create a new StreamReader object."

It should read:

"In the Main method after the StreamWriter object is closed, open the file using the OpenText method of the File class to create a new StreamReader object."

Page 115: The descriptions of the CanRead property is incorrect

On page 115, the description of the CanRead property in Table 2-30 reads:

"Determines whether the stream supports reading while decompressing a file. (Inherited from the Stream class.)"

It should read:

"Determines whether the stream supports reading. (Inherited from the Stream class.)"

Page 120: CompressionMode.Compress used in place of CompressionMode.Decompress

On page 120, the first full code sample read:

' VB 
Dim compStream As _ 
    New GZipStream(sourceFile, CompressionMode.Compress) 
 
// C# 
GZipStream compStream =  
    new GZipStream(sourceFile, CompressionMode.Compress);

It should read:

' VB 
Dim compStream As _
    New GZipStream(sourceFile, CompressionMode.Decompress)

 // C#
GZipStream compStream = 
    new GZipStream(sourceFile, CompressionMode.Decompress);


Page 121: The term "include" used in place of "using" in Step 2

On page 121, step 2 reads:

"Add an Import (or an include in C#) for the System.IO namespace into the new project."

It should read:

"Add an Import (or aa using statement in C#) for the System.IO namespace into the new project."

Page 122: Additional note needs to be added for step 9.

On Page 122, Step 9 an addition NOTE needs to be added before the code sample for more information:

"NOTE: Using a small file may result in the compressed file being larger than the original because of the overhead of compression. If you use a larger file, the size of the overhead will not cause such a pallor on the size of the resulting file."

Page 127: Term "file" used in place of "directory"

On page 127, the description of GetDirectoryNames in Table 2-36 reads:

"Gets a list of directory names within the store that match a file mask"

It should read:

"Gets a list of directory names within the store that match a directory mask"

Page 129: Incorrect definition for IsolatedStorageFileStream

On page 129, the first sentence of the first paragraph reads:

"The IsolatedStorageFileStream class encapsulates a stream that is used to create files in isolated storage."

It should read:

"The IsolatedStorageFileStream class encapsulates a stream that is used to read, write and create files in isolated storage."

Page 133: Files referenced in place of directories

On page 133, the paragraph before the final code sample reads:

"Directories are treated much like files in that to test for their existence, you must use a method that returns an array of strings that match a file mask. The GetDirectoryNames method of the IsolatedStorageFile class allows you to find an existing file before you try to create it:"

It should read:

"Directories are treated much like files in that to test for their existence, you must use a method that returns an array of strings that match a mask. The GetDirectoryNames method of the IsolatedStorageFile class allows you to find an existing directory before you try to create it:"

Page 135: The term "include" used in place of "using" in Step 2

On page 135, step 2 reads:

"Add an Import (or an include in C#) for the System.IO namespace into the new project."

It should read:

"Add an Import (or aa using statement in C#) for the System.IO namespace into the new project."

Page 135: Object referenced in place of class

On page 135, the first sentence of step 3 in Exercise 1 reads:

"In the Main method of the new project, create a new instance of the IsolatedStorageFile object named userStore that is scoped to the current user and assembly."

It should read:

"In the Main method of the new project, create a new instance of the IsolatedStorageFile class named userStore that is scoped to the current user and assembly."

Page 135: Incorrect Visual Basic code in step 3

On page 135, the Visual Basic code in step 3 reads:

' VB 
IsolatedStorageFile userStore = _ 
    IsolatedStorageFile.GetUserStoreForAssembly()

It should read:

' VB
Dim userStore as IsolatedStorageFile = _
    IsolatedStorageFile.GetUserStoreForAssembly()


Page 136: Incorrect Visual Basic code in steps 4 and 5

On page 136, the Visual Basic code in step 4 reads:

' VB 
IsolatedStorageFileStream userStream = new _  
    IsolatedStorageFileStream("UserSettings.set", _ 
                              FileMode.Create, _  
                              userStore) 


It should read:

' VB
Dim userStream as IsolatedStorageFileStream = new _ 
    IsolatedStorageFileStream("UserSettings.set", _
                              FileMode.Create, _ 
                              userStore)


The code in step 5 reads:

' VB 
StreamWriter userWriter = new StreamWriter(userStream) 
userWriter.WriteLine("User Prefs") 
userWriter.Close() 


It should read:

' VB
Dim userWriter as new StreamWriter(userStream)
userWriter.WriteLine("User Prefs")
userWriter.Close()


Page 137: Sample code missing

On page 137, the fifth line of the first section of sample code reads:

// ...

It should read:

Console.WriteLine("No data saved for this user.");


Page 139: Clarification of data in 4th bullet down under Chapter Summary

On page 139, fourth bullet down under Chapter Summary it reads:

"The StreamReader and StreamWriter classes are instrumental in dealing with moving data into and out of streams, including FileStreams, MemoryStreams, and IsolatedStorageFileStreams."

It should read:

"The StreamReader and StreamWriter classes are instrumental in dealing with moving textoriented data into and out of streams, including FileStreams, MemoryStreams, and IsolatedStorageFileStreams."

Page 140: Incorrect description of Case Scenarios

On page 140, the first sentence of the Case Scenarios section reads:

"In the following case scenarios, you will apply what you've learned about how to use application domains and services."

It should read:

"In the following case scenarios, you will apply what you've learned about files and directories."

Page 141: Machine-level data referred to as assembly data

On page 141, the Create a Simple Configuration Storage section reads:

"For this task, you should complete at least Practices 1 and 2. To understand how user and assembly data differ in isolated storage, complete Practice 3 as well.

- Practice 1 Create a Windows Forms application that allows users to save data and store it in isolated storage.
- Practice 2 Test the Windows Forms application by running it under different user accounts.
- Practice 3 Modify the application to store some assembly-level data to see whether that data is the same for all users."

It should read:

"For this task, you should complete at least Practices 1 and 2. To understand how user and machine-level data differ in isolated storage, complete Practice 3 as well.

- Practice 1 Create a Windows Forms application that allows users to save data and store it in isolated storage.
- Practice 2 Test the Windows Forms application by running it under different user accounts.
- Practice 3 Modify the application to store some machine-level data to see whether that data is the same for all users."

Page 141: Machine-level data referred to as assembly data

On page 141, the Create a Simple Configuration Storage section reads:

"For this task, you should complete at least Practices 1 and 2. To understand how user and assembly data differ in isolated storage, complete Practice 3 as well.

- Practice 1 Create a Windows Forms application that allows users to save data and store it in isolated storage.
- Practice 2 Test the Windows Forms application by running it under different user accounts.
- Practice 3 Modify the application to store some assembly-level data to see whether that data is the same for all users."

It should read:

"For this task, you should complete at least Practices 1 and 2. To understand how user and machine-level data differ in isolated storage, complete Practice 3 as well.

- Practice 1 Create a Windows Forms application that allows users to save data and store it in isolated storage.
- Practice 2 Test the Windows Forms application by running it under different user accounts.
- Practice 3 Modify the application to store some machine-level data to see whether that data is the same for all users."

Page 188: Class referenced in place of collection

On page 188, the second sentence of the Adding and Removing Items section reads:

"Adding items to and removing items from the class is very straightforward."

It should read:

"Adding items to and removing items from the collection is very straightforward."

Page 192: Missing newline in code sample

On page 192, the seventh line of the second code sample reads:

// C# IEnumerator enumerator = coll.GetEnumerator();

It should read:

// C# 
IEnumerator enumerator = coll.GetEnumerator();


Page 200: Answer B to question 2 is imprecise

On page 200, answer B reads:

"To test whether two objects are the same reference of an object"

It should read:

"To test whether two variables are referencing the same object"

Page 204: Description of code sample is incorrect

On page 204, the last sentence before the first code sample reads:

"Once you have an instance of the class, you use the Push method to add items to the queue and the Dequeue method to remove items from the list, as shown in this short example:"

It should read:

"Once you have an instance of the class, you use the Push method to add items to the stack and the Pop method to remove items from the stack, as shown in this short example:"

Page 209: DictionaryEntry referred to as DictionaryEntries

On page 209, the fourth bullet point reads:

"Enumerate dictionaries and know how to use DictionaryEntries."

It should read:

"Enumerate dictionaries and know how to use DictionaryEntry."

Page 210: Brackets used incorrectly in VB code example

On page 210, the VB code example under the second paragraph reads:

' VB
Console.WriteLine(emailLookup["sbishop@contoso.com"])

It should read:

' VB
Console.WriteLine(emailLookup("sbishop@contoso.com"))


Page 213: Incorrect method used for supporting class

On page 213, in the fourth sentence of the first paragraph under "Understanding Equality" reads:

"This class supports the GetHash method, which returns an integer that uniquely identifies the object."

It should read:

"This class supports the GetHashCode method, which returns an integer that uniquely identifies the object."

Page 213: Values property referred to as the Value property

On page 213, the last sentence reads:

"You also could iterate over those values by iterating through the Value property instead, as seen in this example:"

It should read:

"You also could iterate over those values by iterating through the Values property instead, as seen in this example:"

Page 216: Incorrect description of Hashtable functionality

On page 216, the second sentence on the page reads:

"This situation is where the Hashtable's ability to provide a class that calculates equality comes in."

It should read:

"This situation is where the Hashtable's ability to use a class that calculates equality comes in."

Page 216: Interfaces referred to as classes

On page 216, the first two sentences of the second paragraph read:

"The Hashtable class supports a constructor that can accept an instance of the IEqualityComparer class as an argument. Much like the IComparer class shown in Lesson 1 that allowed you to sort collections, the IEqualityComparer interface supports two methods: GetHashCode and Equals."

They should read:

"The Hashtable class supports a constructor that can accept an instance of the IEqualityComparer interface as an argument. Much like the IComparer interface shown in Lesson 1 that allowed you to sort collections, the IEqualityComparer interface supports two methods: GetHashCode and Equals."

Page 228: Four bits referenced in place of three bits

On page 228, the second sentence of the third paragraph of the How to Use a BitVector32 for Bit Masks section reads:

"Assume that you need to set the value of the first four bits in some 32-bit integer."

It should read:

"Assume that you need to set the value of the first three bits in some 32-bit integer."

The first sentence of step 4 of the section reads:

"Repeat steps 1 through 3 until you have four bit masks."

It should read:

"Repeat steps 1 through 3 until you have three bit masks."

Page 230: Bits referred to as bytes

On page 230, the eighth sentence of the second paragraph in the Understanding Binary Math section reads:

"So if an unsigned byte has all 8 bytes filled in, it can be represented by this equation: 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255."

It should read:

"So if an unsigned byte has all 8 bits filled in, it can be represented by this equation: 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255."

Page 234: CollectionsUtil referred to as CollectionUtil

On page 234, the third sentence of the Case-Insensitive Collections section reads:

"Because this is such a common use, the .NET Framework has a CollectionUtil class that supports creating Hashtable and SortedList objects that are case insensitive."

It should read:

"Because this is such a common use, the .NET Framework has a CollectionsUtil class that supports creating Hashtable and SortedList objects that are case insensitive."

Page 235: CollectionsUtil referred to as CollectionUtil

On page 235, the sixth sentence of the second paragraph reads:

"Unlike case-insensitive collections, CollectionUtil methods cannot be used to create your collections."

It should read:

"Unlike case-insensitive collections, CollectionsUtil methods cannot be used to create your collections."

Page 238: Incorrect usage of ListCollection class name in Step 3

On page 238, Step 3 reads:

"In the Main method of the project, create a new instance of the ListCollection class, specifying case insensitive and culture invariant."

It should read:

"In the Main method of the project, create a new instance of the ListDictionary class, specifying case insensitive and culture invariant."

Page 239: CollectionsUtil referred to as CollectionUtil

On page 239, the third bullet point reads:

"You can create case-insensitive versions of Hashtable and SortedList objects using the CollectionUtil class."

It should read:

"You can create case-insensitive versions of Hashtable and SortedList objects using the CollectionsUtil class."

Page 246: KeyValuePair referred to as NameValuePair

On page 246, the last entry on the page in Table 4-20 reads:

"DictionaryEntry NameValuePair<>"

It should read:

"DictionaryEntry KeyValuePair<>"

Page 249: Class referred to as object

On page 249, the sentence after the first code sample reads:

"This approach is a lot easier than writing a whole Comparison object for seldom-used comparisons."

It should read:

"This approach is a lot easier than writing a whole Comparison class for seldom-used comparisons."

Page 250: Dictionary referred to as a Queue

On page 250, the fourth sentence of the Generic Dictionary Class section reads:

"To use a generic Queue type, you can follow these steps:"

It should read:

"To use a generic Dictionary type, you can follow these steps:"

Page 250: First line of VB code example incorrect

On page 250, the first line of the VB code example reads:

Dictionary(Of Integer, String) dict = new Dictionary(Of Integer, String)() 
dict(3) = "Three" 
dict(4) = "Four" 
dict(1) = "One" 
dict(2) = "Two" 
Dim str as String = dict(3)

It should read:

Dim dict = New Dictionary(Of Integer, String)() 
dict(3) = "Three" 
dict(4) = "Four" 
dict(1) = "One" 
dict(2) = "Two" 
Dim str As String = dict(3)


Page 254: KeyValuePair referred to as NameValuePair

On page 254, the second sentence of the paragraph following Table 4-23 reads:

"This behavior is unlike the generic Dictionary type, where the enumerator returns a generic NameValuePair object."

It should read:

"This behavior is unlike the generic Dictionary type, where the enumerator returns a generic KeyValuePair object."

Page 258: ReadOnlyCollectionBase class referred to as ReadOnlyCollection base

On page 258, the first sentence of the fifth paragraph in the Writing Your Own Collections section reads:

"Unlike the CollectionBase and ReadOnlyCollection base classes, the DictionaryBase implements the IDictionary, IEnumerable, and ICollection interfaces."

It should read:

"Unlike the CollectionBase and ReadOnlyCollectionBase classes, the DictionaryBase implements the IDictionary, IEnumerable, and ICollection interfaces."

Page 259: The term "state abbreviations" used in place of "calling codes"

On page 259, the first sentence in Exercise 1 reads:

"In this exercise, you create a generic Dictionary to hold state abbreviations with their full names."

It should read:

"In this exercise, you create a generic Dictionary to hold calling codes with their full names."

Page 370: ThreadState.WaitJoinSleep referenced in place of ThreadState.WaitSleepJoin

On page 370, the description of Interrupt in Table 7-2 reads:

"Raises a ThreadInterruptedException when a thread is in a blocked state (ThreadState.WaitJoinSleep). If the thread never blocks, the interruption never happens."

It should read:

"Raises a ThreadInterruptedException when a thread is in a blocked state (ThreadState.WaitSleepJoin). If the thread never blocks, the interruption never happens."

Page 373: Thread referenced in place of value

On page 373, the last sentence of the first paragraph reads:

"Later on, we will use this thread to see what work is being done on which thread."

It should read:

"Later on, we will use this value to see what work is being done on which thread."

Page 373: Correction in method name and output phrase

On page 373, the first and second sentence of the paragraph below the first set of code examples reads:

"When the Start method is called, the SomeWork method is called on a new thread and the thread executes until the method completes. In this example, our SimpleWork method writes the phrase "In Thread" and shows the ManagedThreadId Property."

It should read:

"When the Start method is called, the SimpleWork method is called on a new thread and the thread executes until the method completes. In this example, our SimpleWork method writes the phrase "Thread #" and shows the ManagedThreadId Property."

Page 377: ThreadStart delegate referenced as StartThread

On page 377, the first three sentences of the Passing Data to Threads section read:

"In each of the earlier examples, we were using the StartThread delegate, which takes no parameters. In most real-world use of threading, you will need to pass information to individual threads. To do this, you need to use a new delegate called ParameterizedStartThread."

They should read:

"In each of the earlier examples, we were using the ThreadStart delegate, which takes no parameters. In most real-world use of threading, you will need to pass information to individual threads. To do this, you need to use a new delegate called ParameterizedThreadStart."

Page 378: Missing line break in code sample

On page 378, the first line of the code sample reads:

' VB ParameterizedThreadStart operation = _

It should read:

' VB 
ParameterizedThreadStart operation = _


Page 380: Domain referenced in place of state

On page 380, the first sentence on the page reads:

"To solve the problem of leaving objects or the AppDomain in an inconsistent domain, the Thread class has two important static methods: BeginCriticalRegion and EndCriticalRegion."

It should read:

"To solve the problem of leaving objects or the AppDomain in an inconsistent state, the Thread class has two important static methods: BeginCriticalRegion and EndCriticalRegion."

Page 383: Include statement referenced in place of using statement

On page 383, step 3 reads:

"In the new class, add an include statement (or the Imports statement for Visual Basic) to the System.Threading namespace."

It should read:

"In the new class, add a using statement (or the Imports statement for Visual Basic) to the System.Threading namespace."

Page 383: StartThread referenced in place of ThreadStart

On page 383, step 7 reads:

"Go back to the Main method, and create a new StartThread delegate that points to the Counting method."

It should read:

"Go back to the Main method, and create a new ThreadStart delegate that points to the Counting method."

Page 387: Interlock class referenced in place of Interlocked class

On page 387, the first bullet point reads:

"Use the Interlock class to perform atomic operations."

It should read:

"Use the Interlocked class to perform atomic operations."

Page 389: Reading from memory referred to as reading into memory

On page 389, the second sentence of the paragraph preceeding Figure 7-2 reads:

"As shown in Figure 7-2, two threads could each read the values into memory and update them with the same updated value."

It should read:

"As shown in Figure 7-2, two threads could each read the values from memory and at the same time update them with the same updated value."

Page 390: AddCount method referenced in place of UpdateCount method

On page 390, the first sentence after Table 7-7 reads:

"We can change our AddCount method to use the Interlocked class to solve the threading issue like so:"

It should read:

"We can change our UpdateCount method to use the Interlocked class to solve the threading issue like so:"

Page 407: EventWaitHandles referenced in place of EventWaitHandle

On page 407, the third sentence of the final paragraph reads:

"When creating or opening a named event, you will need to deal with EventWaitHandles instead of the AutoResetEvent and ManualResetEvent classes."

It should read:

"When creating or opening a named event, you will need to deal with EventWaitHandle instead of the AutoResetEvent and ManualResetEvent classes."

Page 410: Interlock class referenced in place of Interlocked class

On page 410, the first bullet point reads:

"To perform atomic math operations, use the Interlock class."

It should read:

"To perform atomic math operations, use the Interlocked class."

Page 414: Bytes written referenced in place of bytes read

On page 414, the first sentence of the first paragraph reads:

"The differences include that it returns an IAsyncResult instead of the number of bytes written and that two parameters are added to the method signature to support APM."

It should read:

"The differences include that it returns an IAsyncResult instead of the number of bytes read and that two parameters are added to the method signature to support APM."

The first sentence following the second code sample reads:

"At the end of the operation, you will call the EndRead with the IAsyncResult object and it will return the bytes written."

It should read:

"At the end of the operation, you will call the EndRead with the IAsyncResult object and it will return the bytes read."

Page 419: Event referenced in place of class

On page 419, the third sentence in the Windows Forms Application Exception Handling box reads:

"You do this by registering for the ThreadException event on the Application event."

It should read:

"You do this by registering for the ThreadException event on the Application class."

Page 421: QueueWorkItem referenced in place of QueueUserWorkItem

On page 421, the first sentence on the page reads:

"Instead of creating a new thread and controlling it, we can use the ThreadPool to do this work by using its QueueWorkItem method:"

It should read:

"Instead of creating a new thread and controlling it, we can use the ThreadPool to do this work by using its QueueUserWorkItem method:"

Page 421: Extra closing parenthesis included in code sample

On page 421, the second code sample reads:

' VB
Dim workItem As New WaitCallback(WorkWithParameter))
If Not ThreadPool.QueueUserWorkItem(workItem,"ThreadPooled") Then
	Console.WriteLine("Could not queue item")
End If

// C#
WaitCallback workItem = new WaitCallback(WorkWithParameter));
if (!ThreadPool.QueueUserWorkItem(workItem, "ThreadPooled"))
{
	Console.WriteLine("Could not queue item");
}

It should read:

' VB
Dim workItem As New WaitCallback(WorkWithParameter)
If Not ThreadPool.QueueUserWorkItem(workItem,"ThreadPooled") Then
	Console.WriteLine("Could not queue item")
End If

// C#
WaitCallback workItem = new WaitCallback(WorkWithParameter);
if (!ThreadPool.QueueUserWorkItem(workItem, "ThreadPooled"))
{
	Console.WriteLine("Could not queue item");
}


Page 424: RegisterWaitHandle referenced in place of RegisterWaitForSingleObject

On page 424, the third sentence of the ThreadPool and WaitHandle section reads:

"This is done by calling the ThreadPool.RegisterWaitHandle, as shown in the following example:"

It should read:

"This is done by calling the ThreadPool.RegisterWaitForSingleObject, as shown in the following example:"

Page 429: Thread execution behavior misrepresented

On page 429, the last sentence of step 8 reads:

"Note that some of the work items are executed on different threads."

It should read:

"Note that some of the work items may be executed on different threads."

Page 432: Case scenario topics misrepresented

On page 432, the first sentence of the Case Scenario section reads:

"In the following case scenarios, you will apply what you've learned about how to use application domains and services."

It should read:

"In the following case scenarios, you will apply what you've learned about the topics of this chapter."

Page 512: The first paragraph on the page is not correct

On page 512, the first paragraph on the page is a reproduction of the first paragraph on page 448. Please disregard this paragraph.

Pages 544-545: ConfigurationSection needs a custom constructor created

On pages 544-545, steps 7 and 8 read:

"7. Select either the Program.cs or Module1.vb file, and open it. Create a new static/shared method with no return type, and name it WriteSettings, as shown here:
' VB
Private Shared Sub WriteSettings()
End Sub

// C#
private static void WriteSettings()
{};

8. Insert the following code into the method:

' VB
Private Shared Sub WriteSettings()

	Try

		Dim LabSection As ConfigurationSection
		Dim config As _
			System.Configuration.Configuration = _
			ConfigurationManager.OpenExeConfiguration( _
			ConfigurationUserLevel.None)
		If config.Sections("LabSection") Is Nothing Then
			LabSection = New ConfigurationSection()
			config.Sections.Add("LabSection", ConfigurationSection)
			customSection.SectionInformation.ForceSave = True
			config.Save(ConfigurationSaveMode.Full)
		End If

		Catch ex As ApplicationException
			Console.WriteLine(ex.ToString())
	End Try
End Sub

// C#
try
	{
	ConfigurationSection LabSection;

	// Get the current configuration file.
	System.Configuration.Configuration config =
		ConfigurationManager.
		OpenExeConfiguration(ConfigurationUserLevel.None);

	if (config.Sections["LabSection"] == null)
		{
		customSection = new ConfigurationSection();
		config.Sections.Add("LabSection", ConfigurationSection);
		customSection.SectionInformation.ForceSave = true;
		config.Save(ConfigurationSaveMode.Full);
		}
	}
catch (ApplicationException ex)
	{
	Console.WriteLine(ex.ToString());
	}
"

They should read:

"7. Select either the Program.cs or Module1.vb file, and open it. Create a new static/shared method with no return type, and name it WriteSettings, as shown here:
' VB
Private Shared Sub WriteSettings()
End Sub

// C#
private static void WriteSettings()
{};

Create a new public class called CustomSection, as shown here:

' VB
Public Class CustomSection
	Inherits ConfigurationSection
End Class

//C#
public class CustomSection : ConfigurationSection
{
	public CustomSection()
	{ }
}

8. Insert the following code into the method:

' VB
Try
	Dim customSection As CustomSection
	Dim config As _
	System.Configuration.Configuration = _
	ConfigurationManager.OpenExeConfiguration( _
	ConfigurationUserLevel.None)
	If config.Sections("LabSection") Is Nothing Then
		customSection = New CustomSection()
		config.Sections.Add("LabSection", customSection)
		customSection.SectionInformation.ForceSave = True
		config.Save(ConfigurationSaveMode.Full)
	End If
Catch ex As ApplicationException
	Console.WriteLine(ex.ToString())
End Try

// C#
try
	{
	CustomSection customSection;

	// Get the current configuration file.
	System.Configuration.Configuration config =
		ConfigurationManager.
		OpenExeConfiguration(ConfigurationUserLevel.None);

	if (config.Sections["LabSection"] == null)
		{
		customSection = new CustomSection();
		config.Sections.Add("LabSection", customSection);
		customSection.SectionInformation.ForceSave = true;
		config.Save(ConfigurationSaveMode.Full);
		}
	}
catch (ApplicationException ex)
	{
	Console.WriteLine(ex.ToString());
	}
"

Page 546: Configuration class referenced in place of ConfigurationManager class

On page 546, the first Lesson Review questions reads:

"Which methods of the Configuration class are valid ways to open a configuration file? (Choose all that apply.)"

It should read:

"Which methods of the ConfigurationManager class are valid ways to open a configuration file? (Choose all that apply.)"

Page 549: Suggested practice heading correction

On page 549, under the Suggested Practices heading it reads:

"Create a Unit of Isolation for Common Language Runtime within a .NET Framework Application by Using Application Domains"

It should read:

"Embed configuration management functionality into a .NET Framework application."

Page 556: Application referenced in place of "event log" in Figure 10-2 caption

On page 556, the caption to Figure 10-2 reads:

"The Windows Event Viewer after the Chap10Demo application has been created and written to"

It should read:

"The Windows Event Viewer after the Chap10Demo event log has been created and written to"

Pages 564-565: The term methods is used in place of members

On page 564, the last sentence reads:

"Those methods are listed in Table 10-1."

It should read:

"Those members are listed in Table 10-1."

On page 565, the title of Table 10-1 reads:

"Methods of the Debugger Class"

It should read:

"Members of the Debugger Class"

Page 567: Incorrect description of the Write method of the Debug class

On page 567, the description of the Write method in Table 10-2 reads:

"Writes information about attached Debug or Trace class listener objects in the Listeners collection."

It should read:

"Writes information to attached Debug or Trace class listener objects in the Listeners collection."

Page 568: Incorrect description of the WriteLine method of the Debug class

On page 568, the description of the WriteLine method in Table 10-2 reads:

"Writes information about attached Debug or Trace class listener objects in the Listeners collection."

It should read:

"Writes information to attached Debug or Trace class listener objects in the Listeners collection."

Page 579: Incorrect reference to the previous version of the .NET Framework

On page 579, the fourth sentence of the DebuggerStepThroughAttribute section reads:

"In previous versions of the .NET Framework, every time you created a Winform for instance, this attribute was added to the InitializeComponent method."

It should read:

"In Visual Basic .NET and Visual Basic 2005, every time you created a Winform for instance, this attribute is applied to the InitializeComponent method."

Page 579: Method referenced in place of attribute

On page 579, the second sentence of the DebuggerStepThroughAttribute section reads:

"Unlike the DebuggerHiddenAttribute though, this method tells the Debugger to step over the code instead of hiding it from output."

It should read:

"Unlike the DebuggerHiddenAttribute though, this attribute tells the Debugger to step over the code instead of hiding it from output."

Page 582: DelimmedListTraceListener referenced in place of DelimitedListTraceListener

On page 582, the second sentence of the Trace Class section reads:

"Visual Studio 2005 has many listener objects built in, including XmlTraceListener, DefaultTraceListener, DelimmedListTraceListener, and EventLogTraceListener."

It should read:

"Visual Studio 2005 has many listener objects built in, including XmlTraceListener, DefaultTraceListener, DelimitedListTraceListener, and EventLogTraceListener."

Page 582-583: Methods referenced in place of members

On page 582, the third sentence of the Trace Class section reads:

"A list of the most useful methods is provided in Table 10-4."

It should read:

"A list of the most useful members is provided in Table 10-4."

The title for Table 10-4 reads:

"Methods of the Trace Class"

It should read:

"Members of the Trace Class"

On page 583, the first sentence after Table 10-4 reads:

"Because these methods are identical to those discussed in the earlier section about the Debug class or they are self explanatory, let's move on."

It should read:

"Because these members are identical to those discussed in the earlier section about the Debug class or they are self explanatory, let's move on."

Page 584: Incorrect configuration file code

On page 584, the fourth line of the first code sample reads:

<add name="DemoApp" value="2" />

It should read:

<add name="DemoApp.Switch" value="Information"/>


Page 590: MyListener not added to the Trace.Listeners collection

On page 590, the code sample for step 4 reads:

' VB
Trace.Listeners.Clear()
Dim MyLog as New EventLog("Chapter10", "localhost", "Chapter10Demo")
Trace.AutoFlush = True
Dim MyListener as EventLogTraceListener = new EventLogTraceListener(MyLog)
Trace.WriteLine("This is a test")

// C#
EventLog MyLog = new EventLog("Chapter10", "localhost", "Chapter10Demo");
Trace.AutoFlush = true;
EventLogTraceListener MyListener = new EventLogTraceListener(MyLog);
Trace.WriteLine("This is a test");

It should read:

' VB
Trace.Listeners.Clear()
Dim MyLog as New EventLog("Chapter10", "localhost", "Chapter10Demo")
Trace.AutoFlush = True
Dim MyListener as EventLogTraceListener = new EventLogTraceListener(MyLog)
Trace.Listeners.Add(MyListener)
Trace.WriteLine("This is a test")

// C#
EventLog MyLog = new EventLog("Chapter10", "localhost", "Chapter10Demo");
Trace.AutoFlush = true;
EventLogTraceListener MyListener = new EventLogTraceListener(MyLog);
Trace.Listeners.Add(MyListener);
Trace.WriteLine("This is a test");


Page 600: The image in Figure 10-13 is incorrect

On page 600, the image in Figure 10-13 should be replaced with the image from Figure 10-14 on page 601.

Page 601: The image in Figure 10-14 is incorrect

On page 601, the image in Figure 10-14 should be replaced with the image from Figure 10-15 on page 607.

Page 606: this used in place of Me in code sample

On page 606, the third line of the first code sample reads:

Info.FileName = this.tbProcessName.Text

It should read:

Info.FileName = Me.tbProcessName.Text


Page 606: Incorrect variable declaration in second code sample

On page 606, the third line of the second code sample reads:

String FileName = "C:\ProcessStartDemo.exe"

It should read:

Dim FileName As String = "C:\ProcessStartDemo.exe"


Page 606: tbFileName not used in Process.Start statement in the third code sample

On page 606, the third code sample reads:

' VB
Dim SecurePassword As New SecureString
For i As Int32 = 0 To Me.tbPassword.Text.Length - 1
	SecurePassword.AppendChar(Convert.ToChar(Me.tbPassword.Text(i)))
Next
Process.Start(Me.tbUserName.Text, Me.tbUserName.Text, SecurePassword, Me.tbDomain.Text)

// C#
SecureString SecurePassword = new SecureString();
for (Int32 i = 0; i < this.tbPassword.Text.Length; i++)
{
	SecurePassword.AppendChar(Convert.ToChar(this.tbPassword.Text[i]));
}
Process.Start(this.tbUserName.Text, this.tbPassword.Text, SecurePassword , this.tbDomain.Text);

It should read:

' VB
Dim SecurePassword As New SecureString
For i As Int32 = 0 To Me.tbPassword.Text.Length - 1
	SecurePassword.AppendChar(Convert.ToChar(Me.tbPassword.Text(i)))
Next
Process.Start(Me.tbFileName.Text, Me.tbUserName.Text, SecurePassword, Me.tbDomain.Text)

// C#
SecureString SecurePassword = new SecureString();
for (Int32 i = 0; i < this.tbPassword.Text.Length; i++)
{
	SecurePassword.AppendChar(Convert.ToChar(this.tbPassword.Text[i]));
}
Process.Start(this.tbFileName.Text, this.tbUserName.Text, SecurePassword,
    this.tbDomain.Text);


Page 607: Incorrect Figure 10-15

On page 607, Figure 10-15 is incorrect. Please disregard this figure.

Page 608: tbUsername used in place of tbUserName

On page 608, the eighth line of the C# code sample reads:

if (this.tbUsername.Text != String.Empty)

It should read:

if (this.tbUserName.Text != String.Empty)


Page 619: IP_Address used in place of IP_Enabled

On page 619, the 28th line of the code sample reads:

if (Convert.ToBoolean(DemoManager[IP_Address]) == true)

It should read:

if (Convert.ToBoolean(DemoManager[IP_Enabled]) == true)


Page 621: Incorrect using directives in step 5

On page 621, the C# code sample in step 5 reads:

Using System.Diagnostics;
Imports System.Management;

It should read:

using System.Diagnostics;
using System.Management;


Page 733: Managers group referenced in place of Accounting group

On page 733, the last sentence reads:

"Even though Mary is a member of the Managers group, and the Managers group has Full Control privileges, the Deny ACE means that all members of the Managers group are denied access to the file."

It should read:

"Even though Mary is a member of the Managers group, and the Managers group has Full Control privileges, the Deny ACE means that all members of the Accounting group are denied access to the file."

Page 790: .NET application referenced in place of COM application

On page 790, the description of the Type Library Exporter in Table 13-1 reads:

"Creates a COM type library that can be consumed by a .NET application"

It should read:

"Creates a COM type library that can be consumed by a COM application"

Page 794: Square brackets used in place of angle brackets

On page 794, the third line of the code sample reads:

[assembly: RuntimeCompatibility(WrapNonExceptionThrows=false)]

It should read:

<Assembly: RuntimeCompatibility(WrapNonExceptionThrows:=False)>


Page 799-800: Unneeded using statements in C# code samples

On pages 799-800, the first three lines of the C# code sample reads:

using System;
using System.Collections.Generic;
using System.Text;

These lines should be removed.

Page 831: Models referenced in place of modules

On page 831, the third sentence reads:

"From assemblies and models all the way down to the individual statements that are part of a line of code, reflection allows you to both interrogate and generate code in .NET."

It should read:

"From assemblies and modules all the way down to the individual statements that are part of a line of code, reflection allows you to both interrogate and generate code in .NET."

Page 834: Code sample included in the wrong location

On page 834, the second and third paragraphs read:

"More interesting are the GetCallingAssembly, GetEntryAssembly, and GetExecutingAssembly calls. These methods allow you to retrieve an instance of the Assembly class for assemblies that are part of the current call stack. GetEntryAssembly returns an instance of the assembly that contains the start-up method (usually the executable assembly for a desktop application), as shown in the following example:
' VB
Dim theAssembly As Assembly = Assembly.GetExecutingAssembly

// C#
Assembly theAssembly = Assembly.GetExecutingAssembly();

You can retrieve the assembly for the currently running code by calling GetExecutingAssembly. In contrast, the GetCallingAssembly retrieves an instance of the Assembly class for the method one level up in the call stack. In other words, it retrieves the assembly that contains the method that called the currently executing code."

They should read:

"More interesting are the GetCallingAssembly, GetEntryAssembly, and GetExecutingAssembly calls. These methods allow you to retrieve an instance of the Assembly class for assemblies that are part of the current call stack. GetEntryAssembly returns an instance of the assembly that contains the start-up method (usually the executable assembly for a desktop application).

You can retrieve the assembly for the currently running code by calling GetExecutingAssembly. In contrast, the GetCallingAssembly retrieves an instance of the Assembly class for the method one level up in the call stack. In other words, it retrieves the assembly that contains the method that called the currently executing code. See the following example:
' VB
Dim theAssembly As Assembly = Assembly.GetExecutingAssembly

// C#
Assembly theAssembly = Assembly.GetExecutingAssembly();
"

Page 838: Include statement referenced in place of using statement

On page 838, step 2 reads:

"Add an include statement (or the Imports statement for Visual Basic) to the System.Reflection namespace to the main code file."

It should read:

"Add a using statement (or the Imports statement for Visual Basic) to the System.Reflection namespace to the main code file."

Page 838: ShowAssembly method referenced in place of ShowAssemblyInfo

On page 838, steps 3, 4, 7 and 9 read:

"3. Create a new static method called ShowAssembly that takes an instance of the Assembly class as a parameter.

4. Inside the new ShowAssembly method, write out the FullName, GlobalAssemblyCache, Location, and ImageRuntimeVersion properties to the console.

7. Call the ShowAssembly method with the new assembly instance.

9. Call the ShowAssembly method again with this instance of the Assembly instance from the executing assembly. Your code might look something like this:"

They should read:

"3. Create a new static method called ShowAssemblyInfo that takes an instance of the Assembly class as a parameter.

4. Inside the new ShowAssemblyInfo method, write out the FullName, GlobalAssemblyCache, Location, and ImageRuntimeVersion properties to the console.

7. Call the ShowAssemblyInfo method with the new assembly instance.

9. Call the ShowAssemblyInfo method again with the Assembly instance from the executing assembly. Your code might look something like this:"

Page 847: GetCustomAttribute referenced in place of GetCustomAttributes

On page 847, the sixth sentence of the Getting Assembly Attributes section reads:

"Because of this, the GetCustomAttribute allows for a Boolean value to indicate whether to get inherited attributes."

It should read:

"Because of this, the GetCustomAttributes allows for a Boolean value to indicate whether to get inherited attributes."

Page 852: Class referenced in place of instance

On page 852, the sentence following the bulleted list in the Getting Types section reads:

"When working with an Assembly class, you can ask it for all the Types in all the modules of the assembly by calling the GetTypes method:"

It should read:

"When working with an Assembly instance, you can ask it for all the Types in all the modules of the assembly by calling the GetTypes method:"

Pages 855-856: InterfaceInfo referenced in place of Type

On page 855, the description for GetInterface in Table 14-8 reads:

"Retrieves a specific InterfaceInfo object that is associated with this Type"

It should read:

"Retrieves a specific Type object that is associated with this Type"

On page 856, the description for GetInterfaces in Table 14-8 reads:

"Retrieves all the InterfaceInfo objects that are associated with this Type"

It should read:

"Retrieves all the Type objects that are associated with this Type"

Page 861: Enumeration referenced in place of property

On page 861, the first two sentences following Table 14-9 read:

"You can see the type of member each of these MemberInfo objects is by checking the MemberType enumeration on the MemberInfo class. This enumeration contains all the different types of members that a MemberInfo object can represent."

They should read:

"You can see the type of member each of these MemberInfo objects is by checking the MemberType property on the MemberInfo class. This property contains an enumeration value that can represent all the different types of members that a MemberInfo object can represent."

Page 864: Include statement referenced in place of using statement

On page 864, step 2 reads:

"Add an include statement (or Imports in Visual Basic) to the System.Reflection namespace to the main code file."

It should read:

"Add a using statement (or Imports in Visual Basic) to the System.Reflection namespace to the main code file."

Pages 864-865: BindingFlag referenced in place of BindingFlags

On pages 864, step 4 reads:

"Create a local BindingFlag variable, and store the flags to get only declared, public instance members."

It should read:

"Create a local BindingFlags variable, and store the flags to get only declared, public instance members."

On page 865, step 10 reads:

"Continue inside the iteration loop, and get all the members from each type using the BindingFlag variable from step 4."

It should read:

"Continue inside the iteration loop, and get all the members from each type using the BindingFlags variable from step 4."

Page 871: Class referenced in place of method

On page 871, the first sentence following the first code sample reads:

"In this example, you are getting the MethodInfo for the overload of the WriteLine class that takes a single String and writes it out to the console."

It should read:

"In this example, you are getting the MethodInfo for the overload of the WriteLine method that takes a single String and writes it out to the console."

Page 871: Object referenced in place of class

On page 871, the first sentence following the second code sample reads:

"Because this is a static method, you specify a null in the parameter that would ordinarily take the instance of the object on which to run the method."

It should read:

"Because this is a static method, you specify a null in the parameter that would ordinarily take the instance of the class on which to run the method."

Page 872: Include statement referenced in place of using statement

On page 872, step 2 reads:

"In the main code file, add an include statement (or Imports for Visual Basic) to the System.Reflection namespace."

It should read:

"In the main code file, add a using statement (or Imports for Visual Basic) to the System.Reflection namespace."

Page 876: EventBulder class referenced in place of EventBuilder class

On page 876, the fourth name in Table 14-11 reads:

"EventBulder"

It should read:

"EventBuilder"

Page 879: Class referenced in place of object

On page 879, the first sentence of the Creating Members section reads:

"The TypeBuilder class that the DefineType method returns is central to creating dynamic code."

It should read:

"The TypeBuilder object that the DefineType method returns is central to creating dynamic code."

Page 881: PropertyAttribute referenced in place of PropertyAttributes

On page 881, the first sentence following the third code sample reads:

"Although defining the property is much like defining a method, the PropertyAttribute enumeration does not allow defining as many aspects of the properties as you might expect."

It shoulld read:

"Although defining the property is much like defining a method, the PropertyAttributes enumeration does not allow defining as many aspects of the properties as you might expect."

Page 882: Include statements referenced in place of using statements

On page 882, step 2 reads:

"In the main code file, add include statements (or Imports statements for Visual Basic) for System.Reflection and System.Reflection.Emit namespaces."

It should read:

"In the main code file, add using statements (or Imports statements for Visual Basic) for System.Reflection and System.Reflection.Emit namespaces."

Page 887: Incorrect scope given for case scenarios

On page 887, the first sentence reads:

"In the following case scenario, you will apply what you've learned about how to use application domains and services."

It should read:

"In the following case scenario, you will apply what you've learned about the topics of this chapter."

Page 930: Error in C# in code sample

On page 930, the first line in the second C# code snippet on page 930 reads:

CompareInfo DemoInfo = Thread.CurrentThread.CurrentCulture.CompareInfo;


It should read:

CompareInfo DemoInfo = new CultureInfo("en-US").CompareInfo;


Page 936: Culture class listed incorrectly in first paragraph

On page 936, the third sentence in the first paragraph reads:

"The CultureRegionAndInfoBuilder class enables you to create and use a customized culture."

It should read:

"The CultureAndRegionInfoBuilder class enables you to create and use a customized culture."

Page 936: Culture class listed incorrectly in first NOTE section

On page 936, under the NOTE .NET 2.0 section it reads:

"The CultureRegionAndInfoBuilder class is new in .NET 2.0"

It should read:

"The CultureAndRegionInfoBuilder class is new in .NET 2.0"

Page 945: Clarification needed for answers B and D for question 2

On page 945, answers B and D for question 2 read:

"B. Correct: Procedures work with a copy of variables when you pass a value type. Therefore, any modifications that were made to the copy would not affect the original value. D. Incorrect: If the variable had been a reference, the original value would have been modified."

They should read:

"B. Correct: Procedures work with a copy of variables when you pass a value type by value. Therefore, any modifications that were made to the copy would not affect the original value. D. Incorrect: If the variable had been passed by reference, the original value would have been modified."

Page 946: Creating items referenced rather than passing them

On page 946, the answers to question 4 read:

"A. Incorrect: You could create a reference class; however, it could be modified when passed to a procedure.
B. Incorrect: You cannot create a reference structure.
C. Incorrect: You could create a value class; however, structures tend to be more efficient.
D. Correct: Value structures are typically the most efficient."

They should read:
"A. Incorrect: You could pass a class by reference; however, it could be modified when passed to a procedure.
B. Incorrect: You could pass a structure by reference; however, it could be modified when passed to a procedure.
C. Incorrect: You could pass a class by value; however passing structures by value tend to be more efficient.
D. Correct: Structures passed by value are typically the most efficient."

Page 953: Answer explanation incorrect

On page 953, Chapter 3, Lesson 1, Question 2 answer A reads:

"A. Correct: ISerializable is an interface that you can implement to perform custom serialization. It is not an attribute."

It should read:

"A. Correct: This code sample works correctly by using the RegexOptions.Multiline option to process multiline input."

Page 954: Corrections in answers for Lesson 2

On page 954, Chapter 3, Lesson 2, Question 1 answers B through D read:

"B. Incorrect: UTF-16 has a smaller byte size than UTF-3
C. Incorrect: UTF-8 has a smaller byte size than UTF-3
D. Incorrect: ASCII has a smaller byte size than UTF-3"

It should read:

"B. Incorrect: UTF-16 has a smaller byte size than UTF-32
C. Incorrect: UTF-8 has a smaller byte size than UTF-32
D. Incorrect: ASCII has a smaller byte size than UTF-32"

Page 977: Reference to question 3 should be removed

On page 977, the answer to chapter 9, lesson 2, question 3 reads:

"3. Correct Answer: D
A. Incorrect: The Custom Actions view is used to facilitate custom actions along the installation path. It has no true bearing on the registry.
B. Incorrect: The File System view is used to facilitate changes to the file system. It has no real control over the registry.
C. Incorrect: There is no Registry Editor view.
D. Correct: The Registry view is the correct view to allow additions and modifications to the registry."

This text should be disregarded.

Page 977: .NET Framework 0 referenced in place of .NET Framework 2.0

On page 977, answers A and B to lesson 3, question 1 read:

"A. Incorrect: Processes can be viewed with the Process class but not with the .NET Framework 0 Configuration tool.
B. Incorrect: Services cannot be viewed with the .NET Framework 0 Configuration tool."

They should read:

"A. Incorrect: Processes can be viewed with the Process class but not with the .NET Framework 2.0 Configuration tool.
B. Incorrect: Services cannot be viewed with the .NET Framework 2.0 Configuration tool."

Page 978: Mapping specification is required for OpenMappedMachineConfiguration

On page 978, lesson 4, question 1, answer D reads:

"Correct: OpenMappedMachineConfiguration is a valid method to open the machine configuration file."

It should read:

"Correct: OpenMappedMachineConfiguration is a valid method to open a machine configuration file as long as a mapping is specified."

Page 986: SecurityAction.Demand can be used declaratively

On page 986, the first answer for Chapter 11, Lesson 3, Question 2 reads:

"A. Incorrect: SecurityAction.Demand instructs the runtime to throw and exception if the caller and all callers higher in the stack lack the specified permissions. However, SecurityAction.Demand must be used imperatively, and the question describes a need for declarative security."

It should read:

"A. Correct: SecurityAction.Demand instructs the runtime to throw and exception if the caller and all callers higher in the stack lack the specified permissions."

Microsoft Press is committed to providing informative and accurate books. All comments and corrections listed above are ready for inclusion in future printings of this book. If you have a later printing of this book, it may already contain most or all of the above corrections.

Modification Type:MinorLast Reviewed:10/9/2006
Keywords:KB923018