When a program or DLL references a strongly-named DLL, all components of the DLL's identity are recorded - assembly name, version number, culture, and public key token. Only that version of the DLL will be loaded. The GAC can contain multiple assemblies with the same base name if they have different version numbers, cultures, and/or public key tokens. That last allows different vendors to use the same base name independently, although this will be pretty confusing to a user! When loading a strongly-named DLL, the GAC is searched first, then the application's directories. See How the Runtime Locates Assemblies[^] for more. To cause a different version of an assembly to be loaded from that listed in the referencing assembly's manifest, you have two options: Publisher Policy[^], or <assemblyBinding>[^] elements in the application's configuration file. The former allows all uses of an assembly to be directed to a new version, but the documentation is a bit unclear. The latter has to be applied to every executable that will use the updated assembly. I'll reiterate that for components that aren't going to be released to third-party developers, I'd recommend keeping your class library assemblies private, without strong naming. If the assembly isn't strongly named you can overwrite without regard to version numbers. It does make deployment slightly more difficult, since you have to copy the updated assembly to the directories of every application you want to use it, but then you should probably only update those