how dot net finds assemblies during program execution