For some reason, Microsoft’s brilliant and cutting-edge .NET development environment left out one crucial tool… a tool that has been common in software development environments since, oh, about 1950, and taken so much for granted that it’s incredibly strange that nobody noticed that .NET doesn’t really have one. Read more on what Joel has to say here.
It does seem kind of strange. We actually ported one of our smaller apps to C# to just check it out. The IDE and the language are quite good, and I think it’s a step forward. But when it came to deploy the application on a customers site, we couldn’t really find a good solution. Installing a specific .NET runtime version on the customers computer isn’t something we really want to have to do. Until the runtime becomes widespread or Microsoft allows linking, I think we’ll stick with what we’ve got now.
as if .NET’s Global Assembly Cache is like the registry… if the registry contained executable content?
Is Microsoft taking the nightmare of the registry to the next level with the GAC?
Well, since the Matrox Parhelia drivers for WinXP/2000 require the .Net framework to be installed, at least you have the few amount of people that bought the P-Series cards from them that could be possible customers…. Other than that, I’m sure Joe Average hasn’t installed it…
I used to develop some simple VB6 apps, and download/installation was always the problem. VB apps would routinely be many times larger than an equivalent C++ app. Now I program C# (love the language, the ide). One of the things stopping me from initially going to C# was the fact that it amplified my biggest problem with VB6 (large downloads… i think VB6 added a mb or two, nothing nowadays but significant when everybody was on dialup). The relief is that .NET will be bundled and downloaded more frequently and download speeds are faster than they used to be. However, I would still love the ability to code C# and have a small exe to distribute. How nice it would make things.
I have to say — the “1950’s” bit got me excited. For a mement there, I thought they were talking about interactive toplevels.
I can dream, can’t I?
I was going to say Java doesn’t link…but it does compile everything into 1 jar file. But java still requires lots of “helper” classes to be installed in exactly the proper place…so I’d guess it’s about the same.
I think in practice most modern software has the same problems…even though C/C++ has a linker….because it’s simply inefficent to NOT use dynamic linking. I mean isn’t it the same problem with dependency heck that most linux users struggle against every time they update? Look how many distros require multiple version copies of 2 & 3 different [but similar function] APIs…
Of course in the Linux model you have a choice to make a giant program with everything or not, you have a choice [and ability!] to keep multiple versions of APIs on your system and provide fine-grained control inside the program which to use. The MS model is on paper a more elegant model…by allowing the program to internally define what it needs…. in practice, without the source…or ability to even choose how to install windows software, the choice to “fix” stuff like the author wanted to is simply… gone… The biggest problem is that the “admin/user” doesn’t have ANY say in the MS model…not that the model itself is bad.
where is the surprise in this?
there is nothing different about the way .NET does this and any other system. Sure, there isn’t a way to link it all into one .exe file, but that may come in the future. that is, in perl and python (among others) that was the case at first- you had to download a big runtime and possibly other libraries to get your app working. these days, you can distribute your app in that way- a 20KB download of your .pl files,or a big-ass executable that integrates all the requisite libraries, VM/runtime system, etc etc. however, this often ends up giving you a file that it almost as big, but at least, it is a little simpler on the user.
again, Java does this too. If i have a .class file or jar, there isn’t some way to encapsulate it all into one double-clickable executable file that I can share. I have to have my users download a big package, the other libraries, and then my app.
.NET is no different, and there is no reason to expect it to be. joel gripes, saying that microsoft will come out with a new version every few months. just like with new versions of perl, python or java, there is no reason that the user would neccesarily have to have the brand-spankinest newest version. if your app requires it, you make it a requirement. put it on the CD, and say- install this if you don’t have it yet. big deal. if you were smart, you’d write your apps against the most common verison- .NET 1.0 or 1.1 for now, just like a lot of Java apps are still written for Java 1.1, not even Java 2! Most folks don’t write apps for the newest Java, 1.4.x unless they really need it.
what the hell is so different about how .NET does it?
Ok, here’s the deal. In time everybody will have the framework. If you compile them directly to native and link whatever you need, you defeat the purpose of a virtual machine. And Joe was stupid going through Windows Update. He should have downloaded the thing directly. Longhorn will have a managed api, the future of Windows is managed. There are tools, search on google that compiles and links the the program right now.
even with a linker, a c++ (win32) app does not hold all the win32 API code – that win32 API stays in DLLs the windows directory. Those DLLs are required to make the nice slim EXEs possible – if the entire API (provided by the OS) was compiled into each and every EXE then they wouldn’t be small.
what the author is hedging is the fact that .NET is a whole new API that intends to replace the win32 API (over time). So .NET will become part of the operating system in the future. In that light his complaint, is something like ‘I had to have an OS installed to run my app.’ To which I say, naturally you do, what where you thinking.
still, the authors real point is that deploying a .NET app on existing Win32 platforms is not fun – to which I agree.
I think in practice most modern software has the same problems…even though C/C++ has a linker….because it’s simply inefficent to NOT use dynamic linking. I mean isn’t it the same problem with dependency heck that most linux users struggle against every time they update? Look how many distros require multiple version copies of 2 & 3 different [but similar function] APIs…
Dependency hell is caused by a completely different phenomenon, that is, the “It can run on my computer, so there for it should run on everyone else”. The developer assumes that because it compiles on his version of Red Hat, which he has butchered, it should work for everyone else.
The developer needs to assume the end user has a vanilla installation of Red Hat, he then needs to think about what his application depends on which isn’t included in the default Red Hat installation. Once he has done that, then he can not only post the application but also list the software which it depends on and where this software can be downloaded from.
Hello.
There are alternatives to the .NET environment. Many companies that produce runtime only environments are still quick too quick on the market for full advantage. Of course, those companies want a piece of the market share before anybody else gets to it. Alternatives do exist.
Neither .NET or Java meet a fully qualified runtime only environment. That is one of the reasons why you mentioned the problems which a linker could solve. Their design is based around a compile-time enviroment in an evolution like from C to C++ to C# [etc]. Their environments hits the demands of the buzzwords for the sale. A fully qualified runtime only environment would put them out of business because that involves open source code.
I am not going to describe what makes a fully qualified runtime only environment; however, I have made such an environment that I plan to use as a foundation for my Computer Science mastery: Atomatrix, http://atomatrix.sourceforge.net .
Perhaps, you may find Atomatrix of interest in the near future as a solution to the closed source world of Java and .NET. And, you may find that you would not need a compile-time linker at all since Atomatrix does such with a dynamic compiler at runtime.
Best post on the subject. I agree 100%. You won’t even have to DL it with Longhorn. And it will be probably included in XP Service Pack 2.
There is no problem.
One disadvantage is that Win98 user can’t use your .NET applications.
You will still have versioning issues even if the runtime is installed.
is this is disk space issue, in the day of 200gb drives?
a bandwidth issue? mail me the 50 cent cdroms, postage included.
i’m not a programmer. so enlighten me, please.
Actually, .NET applications run just fine on Windows 98, but the dependencies are hellish (.NET Framework 1.0 or 1.1, and Internet Explorer 5.01+ minimum)
If only Microsoft would allow different run libraries on the same machine. I remember having two or three different VB libraries on my old Win98 system. Some applications needed VB4 and others needed VB5. Of course, that meant I had to down load both libraries.
If Microsoft knew they were going to update .Net so frequently, why didn’t they make it so users could have different versions of the library? At least you were able to do this with VB. Is Microsoft becoming forgetful?
Someone can correct me if I am wrong but Linux allows you to have different versions of the same library. On my old Redhat system, I had two different versions of Python 2.x on my system. I was able to have the command python launch Python2.2 applications and python2.3 launch Python2.3 applications.
The big abuse in all of this is having the users be aware they have to download all of the libraries.
Library dependencies, in my opinion, is one of the greatest chalengers left to solve for deploying software. In my few years of experiance, its been this problem that has given me the most problems. On windows the best solution seems to be to use the LoadLibrary primitive to get the entry points to your dll. Clunky I know, but its been this aproach that has caused me the least greif. But this approach still requires to first have the dll on your system and that you don’t change your function parameters from when they are first used.
Rip
If Microsoft knew they were going to update .Net so frequently, why didn’t they make it so users could have different versions of the library? At least you were able to do this with VB. Is Microsoft becoming forgetful?
Microsoft did exactly that. If you have .NET 1.0 installed on a machine and app you want to run requires 1.1, you can install (or the app installer can install) 1.1 alongside 1.0 with no problems.
By default, apps developed for older versions of the runtime will try to run on a later version if that is the only version installed.
Developers can also limit their apps to certain runtime versions they have tested with to ensure compatability and limit support scenarios.
http://www.remotesoft.com/linker/
Hi
they said java is dead as soon as .net came out. .net is a windows only lock in product and wont be there for atleast a few years.
poeple take ur rest
Ok, I agree that Microsoft is no fun, but I love to agree with that one anyway. But what I don’t get is why Joel is using floating point to represent dollar values. I thought it was standard practice to use some type of integer to represent cents and place the decimals in the display. Is it because of currency conversions or something that he is doing this?
This is why we use Java and Excelsiors JET compiler to produce a single EXE of only a couple of megabytes.
Very, very stupid article…
.NET Framework must be downloaded/installed ONCE! Framework is automatically downloadable using WindowsUpdate. You can put downloaded “dotnetfx” to server.
.NET Framework is integrated in WinXP PS2, Win2k3, Longhorn.
Any problems?
Maybe Joel’s problem is that a lot of his users don’t have .NET? Not yet.
In a corporate environment you can dictate the installs upon machines, but in the wider world you can’t.
On Joel’s discussion forums much is made of the further incompatibility between 1.0 and 1.1 too.
trolling here. I like lots of his articles, but some make him look just like a jerk.
I don’t know .NET exactly, but at least Java doesn’t have a linker, either. You just set the CLASSPATH (which is just like the LD_LIBRARY_PATH for the Linux dynamic linker, for instance). Then when you run any Java code, the VM looks up the classes (“libraries”) in that path.
The user only needs to have the required libraries installed, just like Unix, where you only need to have (the standard C lib and) 3rd party libs installed.
I suspect .NET doesn’t introduce a revolutionary loading mechanism, but rather works like Java.
Joel also is frustrated by the size of the runtime and standard libraries included with the runtime, but, so am I.
Java and .NET and also many Unix libraries include more and more bloat. Hell, I don’t want to know how many fat libraries are in the standard Windows distributions that Joel’s software just links to! Now there is a technology that requires users to install it first (coz it’s now Windows) and Joel starts whining. JUST DON’T USE IT THEN.
I don’t complain that Java is too fat. I either say it sucks or grudgingly use it, that’s it. It’s about choice in a free market. Joel: if you think that .NET is so great for development, but the lack of a linker is unacceptable for you, leave it or write something like .NET yourself. Thanks.
Multiple versions of Runtime instaleed, apps linking dynamically to the correct version, blah blah blah …
[ Marketroid translator ]
We will carry on DLL dependency hell forever: it really is too hard to get it right (maybe OSX got it, I dunno, never installed it).
If history had to teach us something, it would be that “write once, run anywhere” is pure BS***.
All applets deployed in our intranety fail now and then because clients upgrade their JVM to the latest version (or fail to do so). And they’ve been coded to the specs, not using some internal-undocumented-api (just yesterday I discovered JVM 1.4 does not return a complete Url stream data length on available(), while JVM 1.3 does).
And I cannot FORCE all users to install the same version of the JVM: some apps they use insist on finding one specific version (e.g. HP IM7 uses jre 1.3.1_02 and nothing else, and do it does work when there are more than one jre installed, go figure why).
But then, if you’re developing HTML apps, unless you’re very careful with your pages and js, chances are that different versions of IE will render/work differently. And let’s not even start talking about public sites, where customers can use browsers out the wazoo.
Oh, and please remember vast majority of internet users in my country have 56k modem connections, Windows Update is just not an option. Plus you really have to sit next to your PC all day long, since it asks you to click OK every 5 minutes. And not everybody cares/wants to shell out 5euros for a computer mag with included upgrades on CD every month.
One of the attractive features of latest JDKs (1.4+)
is the WebStart (JNLP) facility which is a neat click
to install feature that caches JAR files and pulls
updates automatically.
Has .NET got any similar capabilities?
A
WebStart doesn’t work if you don’t have a VM installed.
Which is what the article is pretty much all about.
.net has something very similar to WebStart. The name eludes me at the moment.
And stop calling Visual Studio a cutting edge development environment. I used it for the last two years. Now I am back to eclipse and the java world. C# was a good language with some nice things (and a few not-so-nice). But the IDE? A joke compared to what is available in the java world.
“In fact .NET includes an extensive technology system called “manifests” which are manifestly complicated and intended to insure that somehow only the right runtime will be used with a given application, but nobody I know can figure out how to use them.”
That says everything about this guy .NET knowlegdge.
About the linker….that would defeat the whole purpose of fusion/vm/il. I guessed if you don’t understand something you can go ahead and rant about it anyway.
“I put Office Space on the big screen TV, and by the time the movie was over, the installation process was almost finished.”
Good movie. Bad OS. ‘Nuff said.
I think the underlying gripe here is that the author created what ostensibly should be an executable (ie: in DOS/NT parlance it has a .EXE file extension) when in fact it really isn’t an executable.
Java solved this problem by creating class files (.class), Python solved the problem by created .pyo files, etc. Imagine if Java produced .EXE files but required a JRE to run?
The fact of the matter is, that if he is looking for a standalone executable then Joel has picked the wrong platform. Using C# and .NET you don’t create standalone exe’s, you create the bytecode for your CLR to interpret. If you still need binary exe’s, use C/C++ instead (MS still supports this).
The fact of the matter is, that if he is looking for a standalone executable then Joel has picked the wrong platform. Using C# and .NET you don’t create standalone exe’s, you create the bytecode for your CLR to interpret. If you still need binary exe’s, use C/C++ instead (MS still supports this).
The fact of the matter is that there is no technical reason why it should not be possible to combine (“link”) the IL interpreter, the application’s classes (in bytecode) and just the required classes from the .NET framework (again in bytecode) into a single standalone executable. It’ll be years before .NET will become ubiquitous, and even then it’ll be useful to be able to create an .NET application which runs no matter what.
http://www.thinstall.com makes a good solution that packages all the .net dependencies in a single EXE which adds about 5mb to the overall size. This tool also does quite a bit more and its worth checking out.
If he wanted to deploy an application built with Visual Studio .NET, he should have used C++ unmanaged code and he could have done it he wanted.
By choosing C#, I surely hope he was aware that the target machines would required the .NET Framework in order to run??? For a guy who promotes good programming practices and design, that ask to think or design before doing things, I find his complain to be odd. He should have think about it first.
Also, complaining that Windows update wanted to install criticals fix in priority, and that lots of other updates were required, well, do you think you could run recent software on old untested and flaw software? No. So, cut the crap and stay up to date and you won’t have problems with new technology. It has always been like that, and will always been.
And 22 Mb of “run time” is still less than 80…
It has always been like that, and will always been.
No good programmer is ever happy with the ways it has been, that’s why they are good programmers. Especially if the programmer knows how it could be done better.