This chapter starts with a discussion on the importance of testing for an application. You learned that designing and executing a comprehensive test plan is desirable to ensure that an application is robust, accurate, and reliable.
The .NET Framework provides various classes and techniques that implement tracing in applications. You use tracing to display informative messages during a program's execution. The Trace and Debug classes provide different methods to generate messages at specific locations in the code. You have learned how trace switches can be applied to an application to give you control over the type of tracing information generated by an application without even requiring you to recompile the application.
You have also learned about the various C# preprocessing directives that are available in Visual C# .NET. You have seen how you can use the Conditional attribute to conditionally compile methods.
The compiler pinpoints syntactical errors at compile time. The tough job is to find logical and runtime errors in an application. Visual C# .NET offers lots of tools for debugging. In this chapter, you learned about various tools available for debugging.
You also learned how to debug an already running process, debug a process running on a remote machine, and debug DLL files. You also applied these debugging concepts to debug a Windows service, a serviced component, a .NET remoting object, and an XML Web service.
Finally, you learned how to work with event logs and performance counters. As you continue to work with Visual C# .NET, you'll discover more benefits of the tools and techniques discussed in this chapter.