This has to be one of the most commonly asked questions of me over the last 5 years. And much like Godfrey Saxe's wonderful poem on experiential perspectives, the answer varies highly by who you ask.

Many of us who have been rolling in the .NET Framework for 7 years tend to forget that the basic question is of interest to those who haven't used it. And trying to find a simple definition can be maddening. Having stumbled up against most of the elephant, I'll give it a shot :-)

Physically speaking, it is a handful of libraries and files that serve as a platform and API. If you've never looked for it before, check out

C:\WINDOWS\Microsoft.NET\Framework

(or whatever mutations your installation/OS may impart on that templated path)

In a marketing sense, we used to slap the *.NET* suffix on products that took advantage of this platform. We've stopped doing that for the most part, but other people still do it, so you may see that on a product name. 

From the developer mindset it's a layer over Win32 and the physical platform that allows you to build solutions more rapidly. In this sense, it serves a similar role to MFC, ATL, or even VB.

We use the term .NET Framework SDK when we include compilers, some tools, and a bunch of docs. The toolset does not include Visual Studio, which is our flagship IDE for the .NET Framework.

Many Java people ask if the .NET Framework is just the MS response to the Java virtual machine. I would disagree with the premise of that. Sun did not invent the concept of a runtime, nor did MS. The first mainstream runtime that I can think of was SmallTalk's runtime. The .NET Framework is no more an MS response to the JVM than the JVM was a response to the VB Runtime. But I digress....

In some ways, the .NET Framework is similar to the Java virtual machine coupled with its class libraries. Both take intermediate instruction sets (in .NET it is IL - Intermediate Language, in Java it is byte code), and translate it down to the platform instruction set. Java interprets the instructions (HotSpot and other technologies notwithstanding), while .NET compiles individual methods on the first invocation. It's hard to say one is better or worse than the other. JIT-ting almost always performs better, but you can do JIT-like things in Java if needed.

There is a philosophical difference in focus between the two technologies, though. It's almost comical: while both technologies have a specific distinguishing philosophy, few of the developer audiences ever apply the *advantage* of either one. Java emphasizes Write Once, Run Anywhere. Fascinating concept, but you rarely find a successful and sizeable occurence of it anywhere. On the other hand, .NET's Common Language Runtime is about one runtime for any language. You could say Any Language, One Runtime, I guess. Great concept, but I find most companies are standardizing on one .NET language. If they are not standardizing on one language, it's a matter of factions, not standards, that is driving this. 

Perhaps you could say Java is one language, many platforms, while .NET is many languages, one platform. And in the end, most dev audiences I have experienced do one language, one platform, regardless of *which* technology choice they make.

At its core, the .NET Framework is 3 things:

1) A Type System (CTS - Common Type System) that spans languages

2) A Library (FCL - Framework Class Library) that spans languages

3) A runtime (CLR - Common Language Runtime) that spans languages

It is a virtual platform that manages the allocation and cleanup of its types, spans languages, and offers a rapid way to build applications. It is versioned (4 releases - 1.0, 1.1, 2.0, 3.0), and it is free, as are the flagship compilers (C#, VB.NET).

I won't argue whether it is better than Java or worse, as the debate spills way beyond facts to political, emotional, and perhaps even religious debates. I do enjoy it when Java developers try out the .NET Framework, though. I'm sure the other way around is interesting as well, but since I work for Microsoft, I don't usually see that side of things.

Anyway, if you believe I'm leaving any gaping holes around the simple definition, by all means, leave a comment, and I'm happy to discuss further.