Perhaps dll's should work like they do in ASP.NET - when you update a file, it is replaces the already existing one in the cache when it has finished doing it's task.

Also what would be good is when a program wishes to load a dll that needs to be replaced, it instead uses the new version that is to replace it. That way, when programs have finished with the file it is replaced.