As Tony has said - the two assemblies have been loaded from different Codebases (i.e. locations on disk or, indeed, on a LAN or WAN) and therefore not only does .Net load both (dumbly - but not in itself dumb), but it will also see each assembly as being different - with each duplicate type in each assembly being considered different.
It's for this reason that I use LoadFrom with extreme caution, because it will quite happily load the same assembly from different locations.
This is a phenomenon that can also occur - with quite drastic results - in websites where, if pre-loading assemblies, the tempation is to pre-load from the bin\ folder using LoadFrom, whereas in actual fact the aqssemblies will typically be loaded normally from the Temporary Asp.Net Folder (TempASP).
In this scenario it's possible to pre-load AssemblyA from bin\AssemblyA.dll and then the runtime loads it again from TempASP\AssemblyA.dll because that folder is first in the search path used by Load. This can lead to really nasty side-effects such as InvalidCastExceptions being thrown on compiled portions of code that you would think couldn't possibly raise an error normally.
If comparing equality, then the binary compare, as Tony has suggested, is your best bet. If you're actually just looking to load one of the copies of these assemblies, however, then you should consider getting the AssemblyName from the DLL first (there is a constructor for that that doesn't load the assembly) and then passing that name to Assembly.Load - which will then load it from the correct place.