I can't address your grievances as you are entitled to your opinion, but I will address the points you've made that are not correct.
Firstly, right from the start .NET supports legacy code by way of COM interop and pInvoke, to load old DLLs. I used to write a lot of C++ COM objects for financial systems back in the 90s and when .NET came along in oh 2000/2001-ish, they worked fine.
Not being able to have different versions of the .NET framework installed? What???????
Let's have a concrete example, so
here are the ones on my Win10 box right now, all happily co-existing.
Firstly, list the older installed versions of .NET frameworks:
Code:
C:\>dir /b %windir%\Microsoft.NET\Framework\v*
v1.0.3705
v1.1.4322
v2.0.50727
v3.0
v3.5
v4.0.30319
Then a list of the more current installed .NET frameworks:
Code:
C:\>wmic product where "Name like 'Microsoft .Net%'" get Name, Version
Name Version
Microsoft .NET Framework 1.1 1.1.4322
Microsoft .NET Framework 3.5 Targeting Pack (enu) 3.5.28329
Microsoft .NET Framework 4 Multi-Targeting Pack 4.0.30319
Microsoft .NET Framework 4.5 Multi-Targeting Pack 4.5.50710
Microsoft .NET Framework 4.5.1 Multi-Targeting Pack 4.5.50932
Microsoft .NET Framework 4.5.2 Multi-Targeting Pack 4.5.51651
Microsoft .NET Framework 4.6 Targeting Pack 4.6.00081
Microsoft .NET Framework 4.6.1 4.6.01055
Microsoft .NET Framework 4.6.2 Targeting Pack 4.6.01590
Microsoft .NET Framework 4.7 Targeting Pack 4.7.02053
Microsoft .NET Framework 4.7.1 Targeting Pack 4.7.02558
Microsoft .NET Framework 4.7.2 Targeting Pack 4.7.03062
So that's 1.1 through 4.7.x, and for brevity's sake have filtered out the new Core and others. I have all these because I develop, app users may well not have a requirement for so many versions.
Microsoft has always made the .NET installers readily available and any search engine will bring them up - no excuse there. You can install earlier .NET frameworks at any time as they go into their own folders, see my above dir listing so I'm baffled and somewhat bemused by your struggles.
Older apps on earlier frameworks will run from 4.x no change, and you can simply install the NetFx runtime for any earlier one. Search it.
As for bloat, well that would apply to any framework not just .NET. For instance the versions of the Java framework are also very large, and if you install full cygwin that's also sizeable.
Or you could try this in Angular8: ng new EmptyApp ...and you will get 274Mb of stuff generated just for an
empty application!
It's just the way things are, if you want rich functionality (and .NET has it) then this is just par for the course.
Vendor lock-in? It's their own OS. Do Apple and Android do anything different? And .NET has made a bold step and moved off Windows with .NET Core which has been out for the last few years, and it's fully open source and on Github (
https://github.com/dotnet/core)
It runs on Mac, Linux, Windows and I have it running on one of my Raspberry Pi 3 B's... yes, .NET on Raspberry Pi.
Just last week I attended my .NET User Group meeting and the presenter was using his Mac laptop to demo new a .NET feature (AOT ahead-of-time compile) and nobody bat an eyelid.
There has been Mono for years as well. The C# language (which is essentially a much cleaner, nicer and more capable version of Java, when you look at it) specifications are standard and ratified by ECMA and ISO.
Don't like C#? You can use other languages on .NET eg. Pascal, Eiffel, COBOL, BASIC and others
https://en.wikipedia.org/wiki/List_of_CLI_languages
I realise you have your own subjective point of view, but I'll stand by - and support - my claim that .NET is a powerful, mature, stable and altogether great framework, and only getting better.