title: What does it really mean to target a framework, and how do I maximize compatibility?
body: <p>Greetings all,</p>
  
  <p>This has confused me ever since I first started coding in C#.  My goal is to create an assembly that will run on the most recent .NET framework the user has, whatever that may be.  I don't want to require .NET 4 to be installed, but I want to use it if the user has it, and more importantly, I want it to still work if the user has <em>only</em> .NET 4 and nothing below.  I'm beginning to suspect this is not even possible.</p>
  
  <p>I don't really understand what I'm selecting when I change the "Target Framework" in Visual Studio.  Does that mean "will be compatible with this version and up"?  Or "will be compatible with only this version"?  It seems like it's the latter so far; my tests in virtual machines show .NET 4 targeted assemblies failing without .NET 4, and .NET 3.5 targeted assemblies failing without .NET 3.5.  Is there no way to set this so I can achieve maximum compatibility?</p>
  
  <p>UPDATE: To clarify, I have a program that targets .NET 2.  The posters here seem to indicate that it should load with .NET 4.  But in an environment with only .NET 4 and nothing before it, it fails to load.</p>
  
  <p>UPDATE2: Okay, figured it out, but it's far more complex than the posters here seem to think.  I'm opening a different question to discuss the intricacies, but the short version is, you need an app.config with <code>&lt;supportedRuntime version="v4.0" /&gt;</code> in it if you want to run non-.NET 4 assemblies on .NET 4.  They won't load without it.</p>