If your question was "will a user have to re-download 20meg every year or so to get an updated runtime", the answer is unknown. I would guess there would be smaller service packs, hotfixes, etc. to cover the majority of "necessary" upgrades. When it comes to updating a system, there are generally two categories of users: those that upgrade everything and those that never upgrade. For those that never upgrade you only have to worry if you develop on the *newest* version that isn't compatible with an older version. For those that upgrade constantly, you only have to worry if the new framework breaks your code - a very unlikely scenario. I've
never had an issue with the MS runtime causing problems because of an upgrade. The worst thing I've seen is a bunch of controls getting a white background instead of grey one because of an outdated DLL - still not the runtime. Now 3rd party DLLs on the other hand - well, don't get me started
You might think of it this way - if there were issues with programs breaking because the runtime wasn't backwards compatible, there wouldn't be many people developing with it. That's good enough for me, especially since I don't want to write a compiler (I'll let MS do their job on that one).
I'm not sure what you mean about native code...
.NET doesn't compile to native code normally - it compiles to an intermediate language that the runtime compiles "just in time" as the program is loaded. As a developer you have the option of compiling the code into native code for better startup performance using the tool ngen.exe but you run the risk of decreasing performance later. The "compiler" optimizes for the machine it's run on and can't be recompiled later. This means future compilers, which might optimize better, can't be used later on. Also, if you "compile" on a machine different than the end-user's machine, your app may be optimized incorrectly. This could be especially true a few years from now as 64bit processors come out - not to mention a new OS.
To help out with preventing "DLL Hell", MS has changed its strategy on deployment. You should check out the help file at:
Visual Studio .NET -> .NET Framework -> Deploying Applications
It contains a ton of information on what you need to worry about when deploying your app, including upgrades and how the framework finds the right DLL at runtime. They've put a lot of effort into helping us developers get the program running on every machine. It does still mean we have to know a *lot* about what's going on at runtime to figure out how to get our installations to work right *every* time.
For the record, what kind of shareware program are you writing or thinking about writing?
-Nerseus