Git and Mercurial process aplomb binaries. They do not damage them, and you can check them. The problem is size.
The source usually takes up less space than binary files. You can have 100K source files that build a 100Mb binary. Thus, saving one assembly in my repository can lead to its growth 30 times more.
And this is even worse:
Version control systems usually store files through a form format. Let's say I have a file of 100 lines and each line contains about 40 characters. Entire 4K file. If I change the line in this file and save this change, I add only about 60 bytes to the size of my repository.
Now, let's say I compiled and added that a 100Mb file. I make changes to my source code (maybe 10K or so), recompile and save the new binary assembly. Well, binaries usually don't differ very well, so most likely I will add another 100 MB of size to my repository. Make several assemblies, and the size of my repository increases to a few gigabytes, but the original part of my repository is only a few tens of kilobytes.
The problem with Git and Mercurial is that you usually check the entire repository on your system. Instead of just downloading a few tens of kilobytes that can be transferred in a few seconds, now I upload several gigabytes of assemblies along with several tens of kilobytes of data.
Perhaps people are saying that Subversion is better, since I can just check the version I want in Subversion and not download the entire repository. However, Subversion does not give you an easy way to remove obsolete binaries from your repository, so your repository will grow and grow anyway. I still do not recommend it. Hell, I donโt even recommend it, even if the version control system allows you to delete old versions of obsolete binary files. (Perforce, ClearCase, and CVS all do). It just ends with a big maintenance headache.
Now this does not mean that you should not store binary files. For example, if I create a webpage, I probably have some gif and jpeg that I need. There is no problem storing data in Subversion or Git / Mercurial. They are relatively small and probably change much less than my code itself.
What you should not store are constructed objects. They should be stored in the release repository and retrieved as needed. Maven and Ant w / Ivy do a great job of this. Alternatively, you can use the Maven repository structure in C, C ++, and C # projects.