I assure you that you are perfectly capable of avoiding DLL by doing the following:
- If your program has dependencies, check them.
- If you can avoid using COM objects that need registering, do so.
- If you do any sort of update whatsoever, always unregister, then reregister COMs.
- Simply putting a get_version() or similar function in the library, and checking its return.
I would put avoid using .NET framework in the list, but seeing as that it will surely result in flaming, I won't. Really the main thing is the last point on my list. Naming them is a great idea, right? Wrong! Believe it or not, the above average user will think they can get rid of those nasty start-up errors by simply renaming the DLL to match whatever your program argues is "missing." Users are unpredictable. Never forget that.