Description: This document is the first tutorial in a
series of tutorials for programmers learning about the .NET Framework
development environment. What you will
learn is what the .NET Framework is and how it relates to other technologies
such as C# (C-Sharp) and Windows. You
will also learn how to write a simple C# program as well as gain a taste for
the possibilities of this new platform.
Requirements: You should be familiar with at least one programming language, such as C++, Pascal, PERL, Java or Visual Basic. You should be comfortable with general computer science concepts. To do the exercises and run the examples you need a PC running Windows with the .NET Framework installed.
1 Introducing
the .NET Framework with C#
1.1 Code in
a Highly Distributed World
1.2 C#: A First Taste of Managed Code
2.1 Intermediate
Language, Metadata and JIT Compilation.
2.2 Automatic
Memory Management
2.3 Language
Concepts and the CLR
2.4 Advanced
Topics for the Interested
4 Reusable
Components and the FCL
4.1 Object
Oriented Code Reuse
4.2 The
Framework Class Library
4.4 The
.NET Framework SDK Documentation
4.5 Using
FCL Documentation for Types
5.1 The
.NET Framework: Big Picture
5.2 .NET
Application Scenarios
5.3 Draw.aspx
Web Applications
Figure
1‑1 Internet Distributed Software
Figure
2‑1 Managed Code and the CLR
Figure
2‑2 From Source Code to Managed
Executable
Figure
2‑3 From IL to Execution
Figure
2‑4 Managed Objects in the Managed
Heap
Figure
4‑3 Sample SDK Reference Topic
Figure
5‑1 The .NET Framework in Context
Figure
5‑2 Managed Code in an
Internet-Distributed World
Exercise
1‑1 Compile Sample Code
Exercise 1‑2 Compile GUI Sample Code
Exercise
1‑3 EXTRA CREDIT: Modify the GUI Application
Exercise
4‑1 Compile and Test Sample Code
Exercise
4‑2 Create Base64toFile.cs
The .NET Framework is such a comprehensive platform that it can be a little difficult to describe. I have heard it described as a Development Platform, an Execution Environment, and an Operating System among other things. In fact, in some ways each of these descriptions is accurate, if not sufficiently precise.
The software industry has become much more complex since the introduction of the Internet. Users have become both more sophisticated and less sophisticated at the same time. (I suspect not many individual users have undergone both metamorphoses but as a body of users this has certainly happened). Folks who had never touched a computer less than five years ago are now comfortably including the Internet in their daily lives. Meanwhile, the technophile or professional computer user has become much more advanced, as have their expectations from software.
It is this collective expectation from software that drives our industry. Each time a software developer creates a successful new idea, they raise user expectations for the next new feature. In a way this has been true for years. But now software developers face the added challenge of addressing the Internet and Internet-users in many applications that in the past were largely unconnected. It is this new challenge that the .NET Framework directly addresses.
Software that addresses the Internet must be able to
communicate. However, the Internet is
not just about communication. This
assumption has led the software industry down the wrong
In addition to communication other features must be established. These include, security, binary composeability and modularity (which I will discuss shortly), scalability and performance, and flexibility. Even these just scratch the surface, but they are a good start.
Here are some features that users will expect in the near future. Users will begin to expect to run code served by a server that is not limited to the abilities (or physical display window) of a browser. Users will begin to expect websites and server-side code to begin to compose themselves of data and functionality from various venders, giving the end-user flexible one-stop shopping. Users will expect their data and information to be both secured and to roam from site to site so that they don’t have to type it in over and again. These are tall orders, and these are the types of requirements that are addressed by the .NET Framework.
It is not possible for the requirements of the future to be addressed by a new programming language, or a new library of tools and reusable code. It is also not practical to require everyone to buy a new operating system to use that addresses the Internet directly. This is why the .NET Framework is a development environment, execution environment and Operating System.
One challenge for software in a highly distributed environment (like the Internet) is the fact that many components are involved, with different needs in terms of technology. For example, client software such as a browser or custom client has different needs then a server object or data-base element. Developers creating large systems often have to learn a variety of programming environments and languages just to create a single product.

Figure 1‑1 Internet Distributed Software
Take a look at Figure 1‑1. This depicts a typical arrangement of computers and software in a distributed application. This includes client/server communication on several tiers as well as peer-to-peer communication. In the past the tools that you used to develop code at each tier would likely be different, including different programming languages and code libraries.
The .NET Framework can be used to develop software logic at
every point from one end to the other.
This way you get to use the language and programming tools that you are
comfortable with for each stage of the development process. Additionally, the .NET framework uses
standards so that it is not necessary that each piece of the puzzle be
implemented using the framework. These
are the goals of the .NET Framework.
I will describe what all this means in detail shortly.
Software that is written using the .NET Framework is called Managed Code. (Legacy or traditional software is sometimes referred to as Unmanaged Code). I will define managed code later in this tutorial. But for now you should think of managed code as code that runs with the aid of an execution engine to promote the goals of Internet software. These goals include security, robustness, and object-oriented design, amongst others. Managed code is not interpreted, and does run in the native machine language of the host processor, but I am getting ahead of myself.
First things first, I would like to show a couple of examples of managed code written using the C# (pronounced see-sharp) language.
class App{
public static void
System.Console.WriteLine("Hello World!");
}
}
Figure 1‑2 HelloConsole.cs
This short application is written using the C# language. The C# language is just one of the many languages that can be used to write managed code. This source code generates a program that displays the string “Hello World!” to the command line and then exits.
using System.Windows.Forms;
using System.Drawing;
class MyForm:Form{
public static void
Application.Run(new
MyForm());
}
protected override void
OnPaint(PaintEventArgs e){
e.Graphics.DrawString("Hello
World!", new Font("Arial", 35),
Brushes.Blue, 10,
100);
}
}
Figure 1‑3 HelloGUI.cs
This slightly longer source sample is the GUI or windowed version of the Hello World! application. It takes advantage of a few more of the features of the .NET Framework to create a window in which to draw the message string.
Both Figure 1‑2 and Figure 1‑3 are examples of complete C# applications. One of the goals of the .NET Framework is to increase developer productivity and flexibility. One important way to do this is to make software easier to write.
As you can see, the syntax of C# is an object oriented C-based syntax much like C++ or Java. This allows developers to build on previous experience when targeting the .NET Framework with their software.
Before moving on I would like to point out some very simple details to jumpstart your exposure to C#. First, C# source code is typically maintained in files with a .cs extension. Note that both Figure 1‑2 and Figure 1‑3 are labeled with .cs names indicating that they are complete, compileable C# modules.
Second, if you are writing an executable your application
must define an entry point function.
(Modules containing nothing but reusable components do not require an
entry point, but can not be executed as stand-alone applications). With C# the entry point, if there is one, is
always a static method named
The
Exercise 1‑1 Compile Sample Code
Exercise
1‑2
Compile GUI Sample Code